ASP MVC2从表单中检索复杂的嵌套对象

时间:2011-01-03 01:10:33

标签: asp.net asp.net-mvc-2 data-binding

我对ASP MVC很陌生,所以也许这很简单,但我真的卡住了,因为我没有运气搜索论坛;)

我准备了一个简单的问题示例。这就是我想要做的。我有以下模型,我正在传递给视图:

public class SearchModel
{
    public int ItemsFound { get; set; }
    public int TotalItems { get; set; }
    public SearchFacetModel SearchFacet { get; set; }
}

,嵌套类是

public class SearchFacetModel
{
    public string SearchText { get; set; }
    public DateTime DateFrom { get; set; }
    public DateTime DateTo { get; set; }
}

控制器看起来像这样

 [HttpGet]
    public ActionResult Index()
    {
        SearchModel model = new SearchModel { SearchFacet = new SearchFacetModel() { SearchText = "test", DateFrom = DateTime.Now }, ItemsFound=1, TotalItems=10 };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SearchModel model) // Where is model.SearchFacet? Why null?
    {

        return View(model);
    }

观点:

<% using(Html.BeginForm()) { %>
    Search<br />
    <%=Html.TextBoxFor(m=>m.ItemsFound) %><br />   
    <%=Html.TextBoxFor(m=>m.TotalItems) %><br />
    Search Facet<br />
    <% Html.RenderPartial("SearchFacet", Model.SearchFacet); %>   
    <button type=submit>Submit</button>
<%} %>

SearchFacet控件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcApplication3.Models.SearchFacetModel>" %>
<%=Html.TextBoxFor(m=>m.DateFrom) %>
<%=Html.TextBoxFor(m=>m.DateTo) %>
<%=Html.TextBoxFor(m=>m.SearchText) %>

现在,我已经使用HttpPost在Index方法附近添加了注释。我正在获取SearchModel对象,但它没有SearchFacet子对象。孩子是空的。

当我更改SearchFacet.ascx以接受整个SearchModel并从主视图传递它然后它工作。但我不想随时随地传递所有东西。 我肯定遗漏了与模型Binder有关的东西,但有什么以及如何让它按我的方式工作? :)

任何帮助将不胜感激。

Gacu

1 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为partial内的HTML帮助程序没有为输入标记生成正确的名称。如果查看生成的源代码,您将看到:

<input type="text" name="SearchText" id="SearchText" value="test" />

应该是:

<input type="text" name="SearchFacet.SearchText" id="SearchFacet_SearchText" value="test" />

以使默认模型绑定器正确映射POST操作中的对象。解决此问题的一种方法是使用编辑器模板:

<% using(Html.BeginForm()) { %>
    Search<br />
    <%=Html.TextBoxFor(m=>m.ItemsFound) %><br />   
    <%=Html.TextBoxFor(m=>m.TotalItems) %><br />
    Search Facet<br />
    <%= Html.EditorFor(x => x.SearchFacet) %>
    <button type=submit>Submit</button>
<%} %>

然后在里面(~/Views/Home/EditorTemplates/SearchFacetModel.ascx):

<%@ Control 
    Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<MvcApplication3.Models.SearchFacetModel>" %>
<%=Html.TextBoxFor(m=>m.DateFrom) %>
<%=Html.TextBoxFor(m=>m.DateTo) %>
<%=Html.TextBoxFor(m=>m.SearchText) %>

请注意,partial的名称应该与属性的类型相同:SearchFacetModel.ascx并且位于EditorTemplates文件夹中。