mvc 3嵌套对象绑定

时间:2011-06-02 12:31:13

标签: c# asp.net-mvc-3

我对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中使用嵌套对象时,我会做一些非常规的事情吗?

3 个答案:

答案 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) 
}

让我知道上面这一行。