У меня есть 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) ...
Что лучший способ состоит в том, чтобы выполнить это?
Как сказал 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 () - это метод, который возвращает ваш прополночный объект словаря.
См. Этот аналогичный вопрос для получения более подробной информации
Не думаю, что вы сможете построить словарь из дроп-листа на бланке. Выпадающий список вернет только одно значение, которое Вы могли бы установить как свойство 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?
.Решение - пользовательская привязка 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