Модель, связывающая словарь - PullRequest
6 голосов
/ 05 декабря 2010

Мой метод действия контроллера передает Dictionary<string, double?> в представление. У меня есть следующее на мой взгляд:

<% foreach (var item in Model.Items) { %>
<%: Html.Label(item.Key, item.Key)%>
<%: Html.TextBox(item.Key, item.Value)%>
<% } %>

Ниже мой метод действия, который обрабатывает операцию POST:

[HttpPost]
public virtual ActionResult MyMethod(Dictionary<string, double?> items)
{
    // do stuff........
    return View();
}

Когда я ввожу некоторые значения в текстовое поле и нажимаю кнопку отправки, метод действия POST не возвращает какие-либо элементы обратно? Что я делаю не так?

1 Ответ

9 голосов
/ 05 декабря 2010

Я бы порекомендовал вам прочитать это сообщение в блоге о том, как должны называться поля ввода, чтобы вы могли связываться со словарем Поэтому вам понадобится дополнительное скрытое поле для ключа:

<input type="hidden" name="items[0].Key" value="key1" />
<input type="text" name="items[0].Value" value="15.4" />
<input type="hidden" name="items[1].Key" value="key2" />
<input type="text" name="items[1].Value" value="17.8" />

, который может быть сгенерирован с чем-то вроде:

<% var index = 0; %>
<% foreach (var key in Model.Keys) { %>
    <%: Html.Hidden("items[" + index + "].Key", key) %>
    <%: Html.TextBox("items[" + index +"].Value", Model[key]) %>
    <% index++; %>
<% } %>

Как говорится, лично я бы порекомендовал вам НЕ использовать словари в своих взглядах. Они безобразны, и для того, чтобы сгенерировать правильные имена для подшивки модели, вам нужно написать некрасивый код. Я бы использовал вид моделей. Вот пример:

Модель:

public class MyViewModel
{
    public string Key { get; set; }
    public double? Value { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new[]
        {
            new MyViewModel { Key = "key1", Value = 15.4 },
            new MyViewModel { Key = "key2", Value = 16.1 },
            new MyViewModel { Key = "key3", Value = 20 },
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> items)
    {
        return View(items);
    }
}

Просмотр (~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %>
    <%: Html.EditorForModel() %>
    <input type="submit" value="OK" />
<% } %>

Шаблон редактора (~/Views/Home/EditorTemplates/MyViewModel.ascx):

<%@ Control 
    Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<Models.MyViewModel>" %>
<%: Html.HiddenFor(x => x.Key) %>
<%: Html.TextBoxFor(x => x.Value) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...