【问题标题】:mvc 3 nested objects bindingmvc 3嵌套对象绑定
【发布时间】:2011-06-02 12:31:13
【问题描述】:

我对 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)
  {
    ...
  }     
}

这个编辑器在表单标签里面。当我回发到我的控制器时,事件的标题为空,而不是我在表单中输入的内容。我需要某种定制活页夹吗?当我在视图模型中使用嵌套对象时,我是否在做一些非常规的事情?

【问题讨论】:

  • 能否请您发布操作方法的代码?控制器动作中的参数是否为“EventViewModel”类型?如果没有,那就是原因。
  • 我不知道出了什么问题。你没有做任何非常规的事情,你不应该为此需要自定义绑定器。

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


【解决方案1】:

这是您的参数的名称。将其从 @event 更改为 eventViewModel。似乎模型绑定器无法像那样绑定它。它可能会与模型上的 Event 属性混淆。

public ActionResult Create(EventViewModel eventViewModel) {..}

编辑:一些更粗略的解释。

HtmlHelper 创建一个名为 Event.Title 的表单输入,当您对帖子进行绑定时,绑定程序将首先尝试将 Event.Title 绑定到名为 event 的参数,绑定到名为 Title 的属性。由于 EventViewModel 上没有这样的属性,这将为空。您可以通过将参数类型从 EventViewModel 更改为 Event(它有一个名为 Title 的属性)来测试这一点,在这种情况下,绑定不会为空。

相反,如果参数被命名为其他名称,它会尝试通过首先查找名为 Event 的属性,然后查找 Title 来将其绑定到该参数。

【讨论】:

【解决方案2】:

将我的嵌套类的名称更改为 TheEvent 以某种方式解决了问题......这就是我的视图模型现在的样子......

public class EventViewModel
{     
    public Event TheEvent { get; set; }
}

【讨论】:

  • 是的,这也可以。请参阅我的解释。在这种情况下,生成的输入名称将改为 TheEvent.Title..
  • 这是一个幸运的解决方案...我会采用您的解决方案。
【解决方案3】:

哦,对了。当您第一次请求页面时,即您的默认操作,您需要实例化 ViewModel 并将其传递给视图。

public ActionResult DefaultActionForEventView()
{
    var eventViewModel = new EventViewModel();
    eventViewModel.Event = new Event() // I can't remember if you need this line
    return View(eventViewModel) 
}

让我知道上面的那一行。

【讨论】:

  • 我认为这不是问题。
  • 这确实不影响。如果有这样的东西,但模型没有回发
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2021-09-24
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多