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,而不是我在表单中输入的内容。我需要某种自定义活页夹吗?当我在视图模型中使用嵌套对象时,我是否在做一些非常规的事情?

mvc 3嵌套对象绑定

这是参数的名称。将其从@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) 
}

让我知道上面的线路。