Перечисленные значения ModelBinding для списка выбора и выбранного элемента - PullRequest
1 голос
/ 07 июля 2011

Хорошо, это должен был быть вопрос, чтобы попросить помочь заставить мою форму работать должным образом.В процессе создания примера для публикации я выяснил, что это за исправление.

Так что теперь возникает вопрос о том, почему это работает в одну сторону, а не в другую.Я действительно не могу понять поведение.Нашел ли я ошибку в MVC?Или есть что-то, чего я не понимаю в html-запросах, что делает это поведение правильным?

В этом примере задается установка выбранного значения в раскрывающемся списке через свойство enum в модели представления, связанной с строкой запроса (этоВероятно, яснее, о чем я говорю, если вы просто прочитаете код):

Контроллер / Модель

public class HomeController : Controller
{
    public ActionResult Index(TestModel model)
    {
        return View(model);
    }
}

public class TestModel
{
    public SelectList EnumOptions { get; set; }
    public TestEnum EnumValue { get; set; }

    public TestModel()
    {
        var options =  from Enum e in Enum.GetValues(typeof(TestEnum))
                         select new { Value = e, Name = e.ToString() };

        EnumOptions = new SelectList(options, "Value", "Name", TestEnum.NotSet);
    }
}

public enum TestEnum
{
    NotSet = 0,
    Dog = 1,
    Cat = 2
} 

Вид

@Html.DropDownListFor(m => m.EnumValue, Model.EnumOptions)

<a href="?EnumValue=Dog">Dog numeric</a>
<a href="?EnumValue=1">Dog string</a>

Все довольно просто.

Вопрос в том, почему вторая ссылка "Собака" не работает должным образом?Обратите внимание, что он отправляет enumValue как числовое свойство, а не как свойство «string».

Но у подшивки модели с этим проблем нет. Модель, поставляемая в View, в обоих случаях одинакова .Так как же правильно выбрать выбранное значение в одном случае, а не в другом?

1 Ответ

0 голосов
/ 24 августа 2011

DropDownListFor просматривает modelstatedictionary для получения текущего значения поля / свойства.Значение ValueProviderResult для второй ссылки имеет значение 1.

Связыватель модели знает, что запрошенный тип является TestEnum.1 можно преобразовать в собаку.Dropwdownlist преобразует значение ValueProviderResult в строку.1 преобразуется в «1» в виде строки.В списке выбора нет записи со значением «1».

Поэтому в раскрывающемся списке указано неверное текущее значение.

...