【发布时间】:2015-03-28 12:27:13
【问题描述】:
我有一个模型对象结构,其中包含一个 Foo 类,其中包含一个带有字符串值的 Bar。
public class Foo
{
public Bar Bar;
}
public class Bar
{
public string Value { get; set; }
}
还有一个使用这种结构的视图模型
public class HomeModel
{
public Foo Foo;
}
然后我有一个表单,在 Razor 中看起来像这样。
<body>
<div>
@using (Html.BeginForm("Save", "Home", FormMethod.Post))
{
<fieldset>
@Html.TextBoxFor(m => m.Foo.Bar.Value)
<input type="submit" value="Send"/>
</fieldset>
}
</div>
</body>
在 html 中变成了。
<form action="/Home/Save" method="post">
<fieldset>
<input id="Foo_Bar_Value" name="Foo.Bar.Value" type="text" value="Test">
<input type="submit" value="Send">
</fieldset>
</form>
最后是这样处理 post loos 的控制器
[HttpPost]
public ActionResult Save(Foo foo)
{
// Magic happends here
return RedirectToAction("Index");
}
我的问题是Foo 中的Bar 在遇到Save 控制器操作后是null(Foo 已创建但带有nullBar 字段)。
我认为 MVC 中的模型绑定器将能够创建 Foo 和 Bar 对象并设置 Value 属性,只要它看起来像上面那样。我错过了什么?
我也知道我的视图模型有点过于复杂并且可能更简单,但对于我正在尝试做的事情,如果我可以使用更深层次的对象结构,我真的会帮助我。上面的示例使用 ASP.NET 5。
【问题讨论】:
-
你的post方法参数需要是
HomeModel或者你需要使用[Bind(Prefix="foo")]属性。但是你永远不应该在ActionResult方法中命名一个与模型属性同名的参数(绑定会失败) -
@StephenMuecke 感谢您的回复。但是,我确实更改为在
Save操作中接收HomeModel并更改了参数名称 - 但在 Foo 中仍然是一个空对象 ... -
那是因为它是一个字段,而不是一个属性。添加 getter 和 setter :)
-
@StephenMuecke 该死……我以为我可以使用字段……没想到要改变它……谢谢!如果您想要积分,只需将您的评论更改为帖子即可。
-
@Riri,感谢您提供一个简单的示例。我不得不承认,我对相反的情况发生的频率感到不安(当然,这纯粹是提问者的错)。如果这是一个元注释,我很抱歉,但是在经历了这么多关于这个相关问题的相反臃肿的例子之后,它令人耳目一新。
标签: c# asp.net-mvc razor asp.net-mvc-5