ASP.NET MVC ViewModel и DropDownList - PullRequest
       25

ASP.NET MVC ViewModel и DropDownList

5 голосов
/ 30 января 2010

У меня есть 2 свойства в моей ViewModel

class ViewModel1
{
    Dictonary<int, string> PossibleValues {get;set;}//key/value
    int SelectedKey {get;set}
}

Я хочу изменить это, используя Html.DropDownListFor

Я хочу, чтобы MVC автоматически сериализовал данные в / из ViewModel, чтобы я мог сделать следующее

public ActionResult Edit(ViewModel1 model) ...

Какой лучший способ сделать это?

Ответы [ 3 ]

11 голосов
/ 30 января 2010

Как сказал womp, браузер отправит только выбранное значение из выпадающего списка. Это легко связывается с привязкой модели по умолчанию, см. Ниже.

Если вы не редактируете список возможных значений на клиенте, нет необходимости отправлять их обратно. Если вам нужно снова заполнить список, сделайте это на стороне сервера в вашем действии post, используя тот же метод, которым вы изначально заполнили Словарь.

Например, на вашей странице:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<ViewModel1>" %>
<!-- some html here -->
<%= Html.DropDownListFor(x => x.SelectedKey, new SelectList(Model.PossibleValues, "key", "value"))%>

В вашем контроллере

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Edit() {
 var model = new ViewModel1 {
   PossibleValues = GetDictionary()  //populate your Dictionary here
 };
 return View(model);
}

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Edit(ViewModel1 model) { //default model binding
  model.PossibleValues = GetDictionary();  //repopulate your Dictionary here
  return View(model);
}

Где GetDictionary () - это метод, который возвращает заполненный вами объект Dictionary.

См. Этот же вопрос для получения более подробной информации

0 голосов
/ 30 января 2010

Решением является привязка ModelBinding в ASP.NET MVC Framework. Вот несколько примеров.

stevesmithblog.com / блог / связывания-в-Asp-нет- * MVC 1003 *

www.singingeels.com / Статьи / Model_Binders_in_ASPNET_MVC.aspx

odetocode.com / Блоги / Скот / Архив / 2009/04/27 / 12788.aspx

odetocode.com / Блоги / Скот / архив / 2009/05/05 / 12801.aspx

надеюсь, вы найдете их полезными ...

Спасибо

0 голосов
/ 30 января 2010

Не думаю, что вы сможете создать словарь из выпадающего списка в форме. В раскрывающемся списке будет опубликовано только одно значение, которое вы можете установить в качестве свойства SelectedKey, но вы не сможете восстановить из него словарь PossibleValues.

Чтобы восстановить словарь, вам нужно иметь поле формы для каждой записи в нем. Вы можете сделать что-то вроде этого, сгенерированное циклом foreach над вашим словарем:

<input type="hidden" name="PossibleValues[0].Key" value="key0">
<input type="hidden" name="PossibleValues[0].Value" value="value0">
<input type="hidden" name="PossibleValues[1].Key" value="key1">
<input type="hidden" name="PossibleValues[1].Value" value="value1">
.
.
.

В конечном счете, я бы поставил под сомнение необходимость повторного заполнения словаря из формы. Если они могут выбрать только одно значение, почему бы возможным значениям просто не быть поиском где-то вне вашей ViewModel (как в вашем хранилище?) Зачем хранить его с ViewModel?

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