ASP.NET Model Binder и базовый тип - PullRequest
0 голосов
/ 23 марта 2010

Моя модель наследует от интерфейса:

public interface IGrid
{
    ISearchExpression Search { get; set; }
    .
    .
}

public interface ISearchExpression 
{
    IRelationPredicateBucket Get();
}

Модель:

public class Project : IGrid
{
      public ISearchExpression Search { get; set; }

      public Project()
      {
            this.Search = new ProjectSearch();
      }  
}

Поиск проекта:

public class ProjectSearch: ISearchExpression 
{
    public string Name { get; set; }
    public string Number { get; set; }

    public IRelationPredicateBucket Get()
    {...}
}

И строго типизированное частичное представление в основном представлении:

       <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ProjectSearch>" %>

       <%= Html.TextBoxFor(x=>x.Name)%>

       <%= Html.TextBoxFor(x => x.Number)%>

       ....

Когда я отправляю форму, свойство Search не связывается должным образом. Все пусто. Действие принимает аргумент типа ProjectSearch.

Почему Search не связывают, как предполагалось?

EDIT

Акция

public virtual ActionResult List(Project gridModel)
{..}

1 Ответ

2 голосов
/ 23 марта 2010

Вам необходимо указать правильный префикс для привязки подтипов. Например, если вы хотите привязать свойство Name свойства Search к модели, ваше текстовое поле должно иметь имя: Search.Name. Когда вы используете Html.TextBoxFor(x=>x.Name), ваше текстовое поле получает имя Name, и связыватель модели не работает. Одним из обходных путей является явное указание имени:

<%= Html.TextBox("Search.Name") %>

или используйте редактор шаблонов , который является новой функцией в ASP.NET MVC 2.0


UPDATE:

На основе дополнительных сведений, предоставленных в разделе комментариев, приведен пример, который должен работать:

Модель:

public interface IRelationPredicateBucket
{ }

public interface ISearchExpression
{
    IRelationPredicateBucket Get();
}

public interface IGrid
{
    ISearchExpression Search { get; set; }
}

public class ProjectSearch : ISearchExpression
{
    public string Name { get; set; }
    public string Number { get; set; }

    public IRelationPredicateBucket Get()
    {
        throw new NotImplementedException();
    }
}

public class Project : IGrid
{
    public Project()
    {
        this.Search = new ProjectSearch();
    }

    public ISearchExpression Search { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new Project());
    }

    [HttpPost]
    public ActionResult Index(ProjectSearch gridModel)
    {
        // gridModel.Search should be correctly bound here
        return RedirectToAction("Index");
    }
}

Просмотр - ~ / Виды / Главная / Index.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Models.Project>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) { %>
        <% Html.RenderPartial("~/Views/Home/SearchTemplate.ascx", Model.Search); %>
        <input type="submit" value="Create" />
    <% } %>
</asp:Content>

Просмотр - ~ / Виды / На главную / SearchTemplate.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.ProjectSearch>" %>

<%= Html.TextBoxFor(x => x.Name) %>
<%= Html.TextBoxFor(x => x.Number) %>
...