我对MVC 3很新,所以这可能很简单。我有一个带有嵌套对象的viewmodel,如下所示:
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而不是我在表单中输入的内容。我需要某种定制活页夹吗?当我在viewmodel中使用嵌套对象时,我会做一些非常规的事情吗?
答案 0 :(得分:2)
这是您参数的名称。将其从@event更改为eventViewModel。似乎模型绑定器不能像那样绑定它。可能它会与您模型上的Event属性混淆。
public ActionResult Create(EventViewModel eventViewModel) {..}
编辑:一些更粗略的解释。
HtmlHelper创建一个名为Event.Title的表单输入,当您在帖子上进行绑定时,绑定器将首先尝试将Event.Title绑定到名为event的参数,并绑定到名为Title的属性。由于EventViewModel上没有这样的属性,因此它将为null。您可以通过将参数类型从EventViewModel更改为Event(具有名为Title的属性)来查看此测试,在这种情况下,绑定不会为null。
相反,如果参数被命名为else,它将尝试通过首先查找名为Event的属性,然后查找Title来将其绑定到该参数。
答案 1 :(得分:0)
将我的嵌套类的名称更改为TheEvent以某种方式修复了问题...这就是我的viewmodel现在的样子..
public class EventViewModel
{
public Event TheEvent { get; set; }
}
答案 2 :(得分:-1)
哦对。当您第一次请求页面时,即默认操作时,您需要实例化ViewModel并将其传递给视图。
public ActionResult DefaultActionForEventView()
{
var eventViewModel = new EventViewModel();
eventViewModel.Event = new Event() // I can't remember if you need this line
return View(eventViewModel)
}
让我知道上面这一行。