ASP MVC2 Получение сложного вложенного объекта из формы - PullRequest
1 голос
/ 03 января 2011

Я довольно новичок в 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) %>

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

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

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

Gacu

1 Ответ

1 голос
/ 03 января 2011

Причина, по которой это не работает, заключается в том, что помощники 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...