gpt4 book ai didi

c# - 这是 ASP.NET 模型绑定(bind)中的错误吗?

转载 作者:太空狗 更新时间:2023-10-30 01:11:40 25 4
gpt4 key购买 nike

我在 ASP.NET MVC 中有一个简单的表单。我正在尝试将这些结果发布到 Controller 操作,但出现了奇怪的行为。

view 是一个简单的 HTML 表格:

Picture of view

这是 HTML 表单 View 的一部分:

 <form action="/Applications/UpdateSurvey" method="post"><table id=questionsTable class=questionsTable border=1>
<thead><tr><td>Name</td><td>Answer</td><td>Name Attribute(for debugging)</td></tr> </thead><tbody>
<tr>
<td>Question 0:</td>

<td><input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=5 >5&nbsp;&nbsp;</td>
<td>updater.questions[0].responseIds</td>
</tr>
<tr>
<td>Question 1:</td>
<td><input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=5 >5&nbsp;&nbsp;</td>

<td>updater.questions[1].responseIds</td>
</tr>
</tbody></table>

<input type="submit" value="Save" />

</form>

绑定(bind)对象:

public class SurveyUpdater
{
public Question[] questions { get; set; }
}

public class Question
{
public int[] responseIds { get; set; }
}

Controller 操作代码:

    public ActionResult UpdateSurvey(SurveyUpdater updater)
{
if (updater.questions == null)
{
//I dont understand why this is getting hit
}
if (updater.questions.Length != 5)
{
//I dont understand why this is getting hit
}

return View("TestSurvey");
}

经过测试,这是我的观察结果:

  1. 如果我在每个问题上至少选择了一个 CheckBox,这在我的 Controller 中工作正常 updater.questions.Length == 5 和数据完美结合。

  2. 如果我根本不回答其中一个问题,我只会得到一个与我跳过的数字一样大的数组:-1。因此,如果我没有回答问题 #3,我会在 Controller 操作 2 中得到一个数组。

  3. 通过使用 #2 的逻辑,如果我不回答第一个问题,我只会为 updater.questions

    获取 null

我想得到的(也是我期望的)是:

我总是会得到长度为 5问题,如果我没有回答其中一个问题,我只会得到一个 该索引 responseIds 的 0 大小的数组。

这是 ASP.NET MVC 模型绑定(bind)中的错误吗?如果没有,我是否遗漏了什么或有什么方法可以获得我正在寻找的所需行为?

最佳答案

我认为问题是因为当没有选择任何选择时,输入甚至不会在请求参数中传回。解决此问题的一种方法是使用一个默认的隐藏复选框,其中包含一个您可以过滤掉最初为每个问题选择的已知值(如果您愿意,可以使用“未回答”复选框)。这将保证您获得每个问题的选择,并且数组中的每个元素都存在一个请求参数。

从回发内容的角度考虑一下。只有那些具有值、具有名称且未被禁用的元素才会被发布。如果不是所有的问题都有值,那么它应该创建多少个数组项?充其量它可以猜测最后选择的项目应该是数组的大小——但是它应该为介于两者之间的任何项目使用什么值?该框架无法读懂您的想法,并且可以说,尽管为该类型提供默认值可能是合理的,但它不应该这样做。 IMO,最好省略该值,从而强制开发人员在需要时提供默认值。这似乎就是正在发生的事情。

关于c# - 这是 ASP.NET 模型绑定(bind)中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com