【问题标题】:Default ModelBinding converts int field to 0 every time默认 ModelBinding 每次都将 int 字段转换为 0
【发布时间】:2014-12-20 18:28:15
【问题描述】:

我有一个看起来像这样的模型:

[Serializable]
public class Question : RatingItem, IQuestion, IXmlSerializable
{
// ...
    public int TextRows { get; set; }

当我通过帖子将其发送回控制器时,Fiddler 将其捕获如下:

...Question.TextRows=44...

但是在我的控制器的第一行,我的断点说这个值为 0。

    [HttpPost]
    [RequiresResource(SecurityConstants.IndividualOverview_Configuration, eActions.AddNew | eActions.Update)]
    public ActionResult Save(int documentId, string evaluationVariableName, Question question)
    {

// question.TextRows 此处为 0 ...

对发生的事情有任何猜测吗?

我继承了这段代码,但我没有看到任何可以调整的自定义模型绑定器。

更奇怪的是所有其他属性都很好地渗透到控制器中。

【问题讨论】:

  • 有什么理由让 ASP.NET MVC 视图模型实现 IXmlSerializable?这在我看来完全是一团糟。您能否展示您的完整模型代码以及请求的完整 Fiddler 捕获?
  • @DarinDimitrov:这不是一个好的理由。我想过去 XmlSerialization 需要额外的接口,我担心它会破坏一些不会出现在我的单元测试中的东西。如果我发布这个类的模型,恐怕我会因为泄露我们的内部架构而惹上麻烦(安全原因)。
  • 但是,如果您不向您的班级展示,您希望我们如何提供帮助?我的意思是我可以为您编写一个简单的 ASP.NET MVC 应用程序,该应用程序具有一个具有TextRows 整数属性的视图模型和一个包含带有name="Question.TextRows" 的输入字段的视图,我完全向您保证它会工作。所以结论是问题出在你没有显示的代码的某些部分。例如,一些自定义模型绑定器或这种糟糕的 IXmlSerializable 实现不应该在 ASP.NET MVC 视图模型中完成。
  • @DarinDimitrov:是的,我认为这是公平的。我想我可能忽略了一些东西(比如 TextRows 是一个关键词或其他东西)。我会调查可疑的界面。

标签: asp.net-mvc-2 .net-4.0 model-binding


【解决方案1】:

嗯,不看视图很难说,但绑定错误几乎普遍与表单中的错误字段名称有关。例如,根据您显示的代码,您真的不应该有一个名为Question.TextRows 的字段,而应该只有TextRows。 modelbinder 将理解它需要将其放入 Question 的实例中并将其传递给您的 question 参数。

【讨论】:

  • 在这种情况下,输入字段名称为 Question.TextRows=44TextRows=44 是完全一样的,完全不能解释为什么模型绑定不起作用。
  • 这可能是真的。虽然需要注意的是,那是因为他的参数名称是question,而modelbinder不关心大小写,所以Question == question == QUESTION。但是,如果将参数名称更改为 model 之类的其他名称,那么使用哪个 OP 就不再重要了。但是,这里真的没有什么可以解释这个问题的,尝试一下肯定没有坏处。
  • 试试什么?使用TextRows 代替Question.TextRows?我同意这可能值得一试,但恕我直言,因为他的动作参数被命名为question,问题出在其他地方。不幸的是,我们这里没有足够的上下文来判断。
  • 是的。这就是我的建议。而且,就像我说的。你可能是对的,但抓住了稻草和所有东西。不过,根据 OP 目前所呈现的内容,没有其他解释。
  • 当然还有另一种解释。不幸的是,它存在于他迄今为止尚未展示的部分代码中,例如他的IXmlSerializable 实现。不幸的是,这似乎是某种我们无权查看的绝密内容。所以基本上我们可以随心所欲地进行推测,而无需在这里进行任何建设性的对话。
【解决方案2】:

出于某种原因,有人为一个不同的字段编写了一个自动设置器,它覆盖了我正在检查的字段。

从我上面发布的信息中很难确定。

我以为我在这个设置器中设置了一个没有被击中的断点,但我现在可以看到它发生在那里。

谢谢,丹,克里斯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2012-09-20
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多