Словарь <Enum, string> () не будет привязываться к модели в mvc - PullRequest
3 голосов
/ 23 марта 2011

Я пытаюсь достичь чего-то довольно простого, но у меня возникли проблемы с привязкой модели.

public enum ColumnType
        {
            Column1 = 1,
            Column2 = 2,
            Column3 = 3,
            Column4 = 4,
            Column5 = 5,
            Column6 = 6,
            Column7 = 7,
            Column8 = 8,
            Column9 = 9
        }

Далее в моей viewModel у меня есть свойства словаря типов следующим образом:

public class PageViewModel {
        public IDictionary<ColumnType, string> Columns { get; set; }
}

Вот как выглядит мой вид:

    <tr>
    <%  foreach (var value in Enum.GetValues(typeof(ColumnType)))
        {
            %>
                <%: Html.TextBox(String.Format("Columns[ColumnType.{0}]", value.ToString()))%>
            <%
        }
    %>
    </tr>

И я публикую выше следующий метод POST:

[POST]
public ActionResult Index(PageViewModel viewModel)
{
    var isNull = viewModel.Columns; //The model won't bind and 'isNull' is 'null' in here
    ...
    ...
}

Как вы можете видеть, viewModel.Columnsв действии POST свойство имеет значение null.

Что мне здесь не хватает?

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

// pseudocode
Columns[0] = Key=Column1, Value="text1Value";
Columns[1] = Key=Column2, Value="text2Value";
...

Я знаю, что должно быть что-токак Columns[0].Key = Column1; Column[0].Value = "text1Value" внутри вида, но я не уверен.

Большое спасибо заранее, ребята!

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Попробуй так:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new PageViewModel
        {
            Columns = Enum.GetValues(typeof(ColumnType)).Cast<ColumnType>().ToDictionary(x => x, x => x.ToString())
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(PageViewModel model)
    {
        return View();
    }
}

и в представлении:

<% using (Html.BeginForm()) { %>
    <% for (var i = 0; i < Model.Columns.Count; i++) { %>
        <%= Html.Hidden("Columns[" + i + "].Key", Model.Columns.ElementAt(i).Key) %>
        <%= Html.TextBox("Columns[" + i + "].Value", Model.Columns.ElementAt(i).Value) %>
    <% } %>
    <input type="submit" value="OK" />
<% } %>
0 голосов
/ 23 марта 2011

Конечно, это будет null, потому что вы его не инициализировали.

Вы можете написать конструктор для PageViewModel, который создает экземпляр (по ключевому слову new) и заполняет столбцы соответствующими значениями.

PageViewModel model = new PageViewModel();

Хотя я думаю, что вы недостаточно объяснили свой вопрос, поскольку формат, который вы хотите вывести, не соответствует тому, что вы описали в конце своего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...