mvc 3嵌套对象绑定
本文关键字:绑定 对象 嵌套 mvc | 更新日期: 2023-09-27 17:58:19
我对MVC 3很陌生,所以这可能很容易。我有一个带有嵌套对象的视图模型,如下所示:
public class EventViewModel
{
public Event Event { get; set; }
}
public class Event
{
[Required]
public int Id { get; set; }
public string Title { get; set; }
}
在我的"创建"视图中,我这样做:
@model EventViewModel
@Html.EditorFor(model => model.Event.Title)
这是我的事件控制器的代码:
public class EventController : Controller
{
[HttpPost]
public ActionResult Create(EventViewModel @event)
{
...
}
}
此编辑器位于表单标记内部。当我回发到控制器时,事件的标题为null,而不是我在表单中输入的内容。我需要某种自定义活页夹吗?当我在视图模型中使用嵌套对象时,我是否在做一些非常规的事情?
这是参数的名称。将其从@event更改为eventViewModel。看起来模型活页夹不能那样绑定它。它可能与模型上的Event属性混淆了。
public ActionResult Create(EventViewModel eventViewModel) {..}
编辑:一些更粗略的解释。
HtmlHelper创建一个名为Event.Title的表单输入,当您在帖子上进行绑定时,绑定器将首先尝试将Event.Tittle绑定到名为Event的参数和名为Title的属性。由于EventViewModel上没有这样的属性,因此它将为null。您可以通过将参数类型从EventViewModel更改为Event(具有一个名为Title的属性)来测试这一点,在这种情况下,绑定将不会为null。
相反,如果参数被命名为其他名称,它将尝试通过首先查找名为Event的属性,然后查找Title来将其绑定到该参数。
将嵌套类的名称更改为TheEvent以某种方式解决了问题。。。这就是我的视图模型现在的样子。。
public class EventViewModel
{
public Event TheEvent { get; set; }
}
哦,对了。当您第一次请求页面时,即您的默认操作时,您需要实例化ViewModel并将其传递给视图。
public ActionResult DefaultActionForEventView()
{
var eventViewModel = new EventViewModel();
eventViewModel.Event = new Event() // I can't remember if you need this line
return View(eventViewModel)
}
让我知道上面的线路。