Давайте попробуем разобраться с этим:
Ответ на вопрос 1: Как разрешить EditorFor отображать DropDownLists?
Когда вы звоните Html.EditorFor()
, вы можетепередать дополнительные значения ViewData представлению EdiorTemplate:
<%: Html.EditorFor(model => Model.Criteria, new { DeliveryMethods = Model.DeliveryMethods, Currencies = Model.Currencies}) %>
Теперь у вас есть ViewData["DeliveryMethods"]
и ViewData["Currencies"]
, инициализированные и доступные внутри вашего EditorTemplate.
В вашем EditorTemplate
вам как-то нужновызвать и преобразовать эти записи в DropDowns / SelectLists.Предполагая, что у вас есть ascx-файл типа System.Web.Mvc.ViewUserControl<BasketAndOrderSearchCriteriaViewModel>
, вы можете сделать следующее:
<%: Html.LabelFor(model => model.DeliveryMethods) %>
<%: Html.DropDownList("SelectedDeliveryMethod", new SelectList(ViewData["DeliveryMethods"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedDeliveryMethod)) %>
То же самое относится к валютам.
<%: Html.LabelFor(model => model.Currencies) %>
<%: Html.DropDownList("SelectedCurrency", new SelectList(ViewData["Currencies"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedCurrency)) %>
Эта настройка сделает вашу DeliveryMethodAsSelectListItem()
устарел, и вы можете использовать любой вид списка.Означает, что вы не связаны с KeyValuePairs.Теперь вам просто нужно настроить вызов на Html.DropDownList()
.
Как видите, я ввел некоторые новые свойства для ваших BasketAndOrderSearchCriteriaViewModel
:
Model.SelectedDeliveryMethod
Model.SelectedCurrency
Онииспользуются для хранения текущего выбранного значения.
Ответ на вопрос 2: есть ли способ получить выбранное значение DropDownList, привязанного к переданной модели представления?
В шаблоне EditorFor мы передаем вновь созданные свойства Model.SelectedDeliveryMethod
и Model.SelectedCurrency
как SelectedValue Parameter
(см. 4-я перегрузка метода расширения DropDownList ).
Теперь, когдау нас есть представление, выполняющее свою работу: как мы можем получить текущее выбранное значение внутри действия POST ?
Теперь это действительно просто:
[HttpPost]
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model)
{
...
var selectedDeliveryMethod = model.Criteria.SelectedDeliveryMethod;
var selectedCurrency model.Criteria.SelectedDeliveryMethod;
...
}
Примечание:У меня нет IDE, чтобы проверить это прямо сейчас, но это должно сработать или, по крайней мере, показать вам, в каком направлении идти.