我对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
答案 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
文件夹中。