2011-01-03 2 views
1

Я совсем новичок в ASP MVC, так может быть, это просто, но я действительно застрял потому что я искал на форумах, не повезло;)ASP MVC2 Получение сложного вложенного объекта из формы

Я подготовил простой пример моей проблемы. Вот что я пытаюсь сделать. У меня есть следующая модель, которую я передаю к виду:

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); 
    } 

The зрение:

<% 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 contr ol:

<%@ 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) %> 

Теперь, я уже поставил комментарий рядом с методом Index с HttpPost. Я получаю объект SearchModel, но у него нет дочернего объекта SearchFacet. Ребенок имеет значение null.

Когда я меняю SearchFacet.ascx, чтобы принять всю SearchModel и передать ее с основного вида, тогда она работает. Но я не хочу передавать все вещи всегда и везде. У меня наверняка отсутствует что-то, связанное с Model Binder, но что и как заставить его работать? :)

Любая помощь будет оценена по достоинству.

Gacu

ответ

1

Причина это не работает потому, что 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) %> 

Обратите внимание, что имя парциальное должно быть таким же, как тип собственности: SearchFacetModel.ascx и находится внутри папки EditorTemplates.

+0

Thanx. Вот чего мне не хватало :) – Krzysztof

Смежные вопросы