ASP.NET MVC ViewModel и DropDownList

У меня есть 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) ...

Что лучший способ состоит в том, чтобы выполнить это?

5
задан tereško 25 February 2013 в 15:41
поделиться

3 ответа

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

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

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

<%@ 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);
}

в том, что GetDicationAry () - это метод, который возвращает ваш прополночный объект словаря.

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

11
ответ дан 13 December 2019 в 19:27
поделиться

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

Для того, чтобы восстановить словарь, вам понадобится поле формы для каждой записи в нем. Вы можете сделать нечто подобное, сгенерированное с помощью петли фораха над вашим словарем:

<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">
.
.
.

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

.
0
ответ дан 13 December 2019 в 19:27
поделиться

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

stevesmithblog.com/blog/binding-in-asp-net-mvc

www.singingeels.com/Articles/Model_Binders_in_ASPNET_MVC.aspx

odetocode.com/Blogs/scott/archive/2009/04/27/12788.aspx

odetocode.com/Blogs/scott/archive/2009/05/05/12801.aspx

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

Thanks

0
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: