ASP.NET MVC Model Binder не работает со словарем - PullRequest
1 голос
/ 12 июля 2010

Принимая во внимание следующую модель представления и действие с использованием DefaultModelBinder, кажется, что он игнорирует словарь, но правильно связывает все остальные свойства.Я что-то здесь упускаю?Глядя на исходный код MVC, это кажется законным.

Спасибо

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>

И для справки, вывод HTML:

<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="" />

РЕДАКТИРОВАТЬ: Выше не будетработать, как указано ниже, однако я предпочитаю этот макет, и следующий быстрый хак работает для моих нужд, звоните по этому поводу сразу после публикации ...

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

Это требует некоторого приближения конечно:)

1 Ответ

6 голосов
/ 12 июля 2010

Вы можете взглянуть на этот пост , чтобы увидеть, как следует связывать словари. Боюсь, что с помощью строго типизированных EditorFor помощников вы не сможете этого добиться, и вам придется создавать поля вручную.

...