2010-07-12 6 views
1

Étant donné le modèle de vue et l'action suivants utilisant le DefaultModelBinder, il semble ignorer le dictionnaire, mais lier correctement toutes les autres propriétés. Est-ce que j'ai râté quelque chose? En regardant le code source MVC cela semble légitime.ASP.NET MVC Model Binder ne fonctionne pas avec un dictionnaire

Merci

public class SomeViewModel 
{ 
    public SomeViewModel() 
    { 
     SomeDictionary = new Dictionary<string, object>(); 
    } 

    public string SomeString { get; set; } 
    public IDictionary<string, object> SomeDictionary { get; set; } 
} 

[HttpPost] 
public ActionResult MyAction(SomeViewModel someViewModel) 
{ 
    //someViewModel.SomeString binds correctly 
    //someViewModel.SomeDictionary is null 
} 

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<SomeViewModel>" MasterPageFile="~/Views/Shared/Site.Master" %> 
<asp:Content runat="server" ID="Content2" ContentPlaceHolderID="MainContent"> 
<% using (Html.BeginForm("MyAction", "MyController")) {%> 

    <%= Html.EditorFor(m => m.SomeString) %> 
    <%= Html.EditorFor(m => m.SomeDictionary["somevalue"]) %> 

    <input type="submit" value="Go" /> 
<%} %> 
</asp:Content> 

Et pour référence, la sortie HTML est:

<input class="text-box single-line" id="SomeString" name="SomeString" type="text" value="" /> 
<input class="text-box single-line" id="Somedictionary_somevalue_" name="SomeDictionary[somevalue]" type="text" value="" /> 

EDIT: Le ne fonctionnera pas ci-dessus comme indiqué ci-dessous, mais je préfère cette mise en page et le hack suivant fonctionne pour mes besoins, appelez cela juste après avoir posté ...

someViewModel.SomeDictionary = (from object key in Request.Form.Keys 
           where key.ToString().StartsWith("SomeDictionary[") 
           select new 
           { 
            Key = key.ToString().Replace("SomeDictionary[", string.Empty).Replace("]", string.Empty), 
            Value = (object)Request.Form[key.ToString()] 
           }).ToDictionary(arg => arg.Key, arg1 => arg1.Value); 

Il faut un peu de rangement ourse :)

Répondre

6

Vous pouvez jeter un oeil à this post pour voir comment les dictionnaires devraient être liés. J'ai peur qu'en utilisant des helpers fortement typés, vous ne serez pas capable de réaliser cela et vous devrez générer les champs manuellement.

+0

Aha, je vois maintenant, merci! Je n'aime pas vraiment cette mise en page, cependant j'ai un hack très rapide qui fonctionnera pour mes besoins, je le posterai ci-dessus. – amarsuperstar

Questions connexes