2010-03-23 2 views
0

Mon modèle hérite d'une interface:Modèle ASP.NET Binder et le type de base

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

public interface ISearchExpression 
{ 
    IRelationPredicateBucket Get(); 
} 

Le modèle:

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

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

Le ProjectSearch:

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

    public IRelationPredicateBucket Get() 
    {...} 
} 

Et la forte PartialView typée dans la vue principale:

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

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

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

     .... 

Lorsque je soumets le formulaire, la propriété Search n'est pas liée correctement. Tout est vide. L'action prend un argument de type ProjectSearch.

Pourquoi le Search n'est pas lié comme supposé?

EDIT

L'action

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

Répondre

2

Vous devez spécifier le préfixe correct pour lier sous-types. Par exemple, si vous souhaitez lier à la propriété Name de la propriété Search du modèle, votre zone de texte doit être nommée: Search.Name. Lorsque vous utilisez Html.TextBoxFor(x=>x.Name) votre zone de texte s'appelle Name et le classeur de modèle ne fonctionne pas. Une solution de contournement consiste à spécifier explicitement le nom:

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

ou utiliser editor templates qui est une nouvelle fonctionnalité dans ASP.NET MVC 2,0


MISE À JOUR:

Sur la base des informations fournies en la section commentaires est ici un échantillon qui devrait fonctionner:

Modèle:

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

Controller:

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

Vue - ~/Vues/Accueil/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> 

Vue - ~/Vues/Accueil/SearchTemplate.ascx:

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

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

J'ai essayé dans les deux sens, niether travaillé. Je pense que cela a quelque chose à voir avec le type de base de la propriété Search. Son ISearchExpression. Peut-être que pendant que la liaison est en cours, la recherche est de type ISearchExpression, par conséquent le classeur modèle ne peut pas voir la propriété Name. Fait ce sens? – user137348

+0

Pouvez-vous afficher le code de l'action à laquelle vous envoyez des messages? –

+0

J'ai édité le post et j'ai ajouté le code d'action. – user137348

Questions connexes