2010-03-23 3 views
0

내 모델은 인터페이스에서 상속 :ASP.NET 모델 바인더 및 기본 유형

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

ProjectSearch :

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

    public IRelationPredicateBucket Get() 
    {...} 
} 

그리고 강한 입력 된 partialview 주요보기 :

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

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

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

     .... 

양식을 제출하면 Search 속성이 제대로 바인딩되지 않습니다. 모든 것은 비어 있습니다. 액션에는 ProjectSearch 유형의 인수가 필요합니다.

Search이 예상대로 연결되지 않는 이유는 무엇입니까?

편집

액션 당신은 하위 유형을 결합하기 위해 올바른 접두사를 지정해야

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

답변

2

. 예를 들어 모델의 Search 속성의 Name 속성에 바인딩하려는 경우 텍스트 상자의 이름은 Search.Name이어야합니다. Html.TextBoxFor(x=>x.Name)을 사용할 때 텍스트 상자의 이름은 Name이며 모델 바인더가 작동하지 않습니다. 한 가지 해결 방법은 명시 적으로 이름을 지정하는 것입니다 :

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

또는 ASP.NET MVC의 새로운 기능입니다 editor templates을 사용하여 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) %> 
+0

나는 양쪽 방법을 시도했다, niether는 일했다. 검색 유형 속성의 기본 유형과 관련이 있다고 생각합니다. 그것의 ISearchExpression. 바인딩이 발생하는 동안 Search가 ISearchExpression 유형이므로 모델 바인더가 Name 속성을 가질 수 없습니다. 이게 말이 되니? – user137348

+0

게시 할 작업에 대한 코드를 표시 할 수 있습니까? –

+0

게시물을 편집하고 액션 코드를 추가했습니다. – user137348

관련 문제