Как связать списки пользовательской модели представления с dropDownList и получить выбранное значение после POST в ASP.NET MVC? - PullRequest
1 голос
/ 11 июня 2010

У меня следующая проблема. В моей модели представления я определил некоторые свойства списка следующим образом:

public class BasketAndOrderSearchCriteriaViewModel
{
    List<KeyValuePair> currencies;
    public ICollection<KeyValuePair> Currencies
    {
        get
        {
            if (this.currencies == null)
                this.currencies = new List<KeyValuePair>();
            return this.currencies;
        }
    }

    List<KeyValuePair> deliverMethods;
    public ICollection<KeyValuePair> DeliveryMethods
    {
        get
        {
            if (this.deliverMethods == null)
                this.deliverMethods = new List<KeyValuePair>();
            return this.deliverMethods;
        }
    }
 }

Эта модель представления встроена в другую модель представления:

 public class BasketAndOrderSearchViewModel
 {
    public BasketAndOrderSearchCriteriaViewModel Criteria
    {
        [System.Diagnostics.DebuggerStepThrough]
        get { return this.criteria; }
    }
 }

Я использую 2 метода действия; один для GET, а другой для POST:

[HttpGet]
public ActionResult Search(BasketAndOrderSearchViewModel model){...}

[HttpPost]
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model){...}

В представлении я реализую всю модель представления с помощью помощника EditorFor-Html, который не хочет автоматически отображать DropDownLists для свойств List! 1. Вопрос: Как вы можете разрешить EditorFor отображать DropDownLists?

Поскольку я не мог понять, как отображать DropDownLists с помощью EditorFor, я использовал HDml-помощник DropDownList и заполнил его через модель представления следующим образом:

    public IEnumerable<SelectListItem> DeliveryMethodAsSelectListItem()
    {
        List<SelectListItem> list = new List<SelectListItem>();
        list.Add(new SelectListItem()
        {
            Selected = true,
            Text = "<Choose Delivery method>",
            Value = "0"
        });
        foreach (var item in this.DeliveryMethods)
        {
            list.Add(new SelectListItem()
            {
                Selected = false,
                Text = item.Value,
                Value = item.Key
            });
        }

        return list;
    }

Мой вопрос 2. Как вы можете видеть, я передаю свою модель представления методу действия с атрибутом POST! Есть ли способ получить выбранное значение DropDownList, привязанного к переданной модели представления? В настоящий момент все DropDownList пусты и выбранное значение может быть получено только с помощью Request.Form, который я определенно определил. хочу избежать!

Буду очень признателен за некоторые идеи или советы по этому поводу.

Ответы [ 2 ]

2 голосов
/ 31 октября 2010

Для тех, кто, как я, попал на этот пост в эти дни, я бы порекомендовал вам полностью загрузить учебник с http://www.asp.net/mvc/tutorials/mvc-music-store-part-1, который охватывает этот и большинство распространенных методов, связанных с приложениями .NET MVC.

Во всяком случае, действительно полезно ваше сообщение и ответы человек (Если бы я мог голосовать за вас, я бы:)

1 голос
/ 11 июня 2010

Давайте попробуем разобраться с этим:

Ответ на вопрос 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, чтобы проверить это прямо сейчас, но это должно сработать или, по крайней мере, показать вам, в каком направлении идти.

...