Почему SelectList SelectedValue работает на HttpGet, а не на HttpPost? - PullRequest
2 голосов
/ 05 мая 2011

Используя MVC3, я обнаружил, что установка выбранного значения SelectList правильно отображает представление в HttpGet, но не может правильно отображаться в HttpPost.Я проверил модель до того, как она будет перенаправлена ​​в представление на HttpPost, и они корректно обновляются, просто кажется, что представление неправильно отображает выбранный тег.

На HttpPost <select> отображается точнокак он существовал после любых изменений, но до представления формы.m.SelectedWidgetId = 2; в методе HttpPost выполняется, обновляет модель, но не отображается в представлении.

Что мне здесь не хватает?

Модель:

public class WidgetModel
{
    private Widget[] Widgets {
        get
        {
            return new Widget[] { 
                new Widget { Id=1, Name="Item 1" },
                new Widget { Id=2, Name="Item 2" },
                new Widget { Id=3, Name="Item 3" }
            };
        }
    }
    public SelectList WidgetList
    {
        get
        {
            return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
        }
    }
    public int SelectedWidgetId { get; set; }
}

Просмотр:

@model thisProject.Models.WidgetModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");      
    <input type='submit' />                                                                                    
}

Методы контроллера;

public ActionResult Widget()
{
    var m = new WidgetModel();
    m.SelectedWidgetId = 1;
    return View(m);
}
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    m.SelectedWidgetId = 2;
    return View(m);
}

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Это происходит потому, что помощники HTML всегда используют значения в запросе перед значениями в модели при рендеринге значения. По сути, это означает, что если вы хотите изменить какое-либо значение в действии POST, вам нужно сначала удалить его из состояния модели:

[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    ModelState.Remove("SelectedWidgetId");
    m.SelectedWidgetId = 2;
    return View(m);
}

или помощник просто проигнорирует значение, которое вы устанавливаете вручную, и использует значение, которое было отправлено пользователем.

2 голосов
/ 05 мая 2011

в asp.net mvc выбранное значение selectList переопределяется значением свойства, для которого создается раскрывающийся список, когда мы используем строго типизированный помощник, т. Е.

<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%>

в этом случае значение Model.selectedwidgetID переопределит значение, установленное в

new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
...