ASP.NET MVC中将Model中奖数组传递到Controller与用户输入对比相关问题
问题解答
1. 是否应该在Controller中完成两个数组的对比操作?
不建议把对比逻辑写在Controller中。MVC架构中Controller的核心职责是处理请求调度、参数接收、视图跳转,业务逻辑应该封装到Model层,保证逻辑可复用,也方便后续维护。你可以直接在LottoNumbersCampbellModel中新增校验匹配的方法,Controller只需要调用该方法获取结果即可。
2. 如何将Model中的_winningNumber数组传递到Controller用于对比?
你当前代码里的_winningNumbers是私有字段,外部无法直接访问,首先需要在Model中新增公共只读属性暴露中奖号码,避免外部随意修改:
// 新增到LottoNumbersCampbellModel类中 public int[] WinningNumbers => _winningNumbers?.Clone() as int[];
另外你现有代码存在两个bug需要先修复:
- 构造函数没有初始化
_winningNumbers数组,调用GenerateLottoNumbers时会触发空引用异常,你可以在构造函数中给_winningNumbers初始化长度为4的数组 GenerateLottoNumbers方法的传入参数winningNumbers没有被使用,可以直接删掉这个参数
修复后Controller中只要实例化Model对象,调用GenerateLottoNumbers生成中奖号码后,直接读取WinningNumbers属性即可拿到中奖数组。
3. 如何将视图中4个输入框的内容绑定到Controller的数组中?
ASP.NET MVC的模型绑定支持按索引匹配数组参数,你只需要在视图中给4个输入框的name属性按数组索引规则命名即可:
<form method="post" action="/Home/CheckResult"> <input type="number" name="userNumbers[0]" min="1" max="71" required /> <input type="number" name="userNumbers[1]" min="1" max="71" required /> <input type="number" name="userNumbers[2]" min="1" max="71" required /> <input type="number" name="userNumbers[3]" min="1" max="71" required /> <button type="submit">校验中奖结果</button> </form>
对应的Controller中新增接收请求的Action,参数命名和输入框的name前缀一致即可:
[HttpPost] public IActionResult CheckResult(int[] userNumbers) { // 这里的userNumbers就是用户输入的4个号码组成的数组 }
如果你用强类型视图,也可以给Model新增UserNumbers属性,用@Html.TextBoxFor(m => m.UserNumbers[0])的方式生成输入框,绑定逻辑和上面一致。
4. 数组对比前是否需要先对两个数组分别排序?
取决于你当前彩票的规则:
- 如果要求号码和顺序完全一致才算中奖:不需要排序,直接按顺序对比每个位置的元素即可
- 如果只要求号码匹配,不限制输入顺序(绝大多数彩票的规则):必须排序后再对比,否则用户输入顺序和中奖号码顺序不一致时,明明号码全中也会被判为不中奖。
你可以直接在GenerateLottoNumbers生成中奖号码后就排序,用户输入的数组在校验前也先排序,再做对比即可。你现有代码里的排序注释可以补全为:
// 生成完中奖号码后添加 Array.Sort(_winningNumbers);
内容的提问来源于stack exchange,提问作者Kcampbell22
相关产品推荐
相关产品推荐

