DropDownListFor - не выбирает" выбранное " значение

еще один из этих вопросов в отношении DropDownListFor не выбрав "избранные" значение. Вот код:

модель:

public class CreateEditAccountModel
{
    [Required]
    [Display(Name = "Permission")]
    public int PermissionId { get; set; }
    public IEnumerable<SelectListItem> Permissions { get; set; }
}

:

[HttpGet]
[Authorize]
public ActionResult EditAccount(int id)
{
    CreateEditAccountModel model = new CreateEditAccountModel();
    model.Permissions = PermissionsAll();
    return View("CreateEditAccount", model);
}

в этот момент, если я поставлю точку останова на обратной линии,model.Permissions содержится надлежащая IEnumerable<SelectListItem> объект с несколькими элементами и только один, который имеет Selected = true.

вид:

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions)
}

выводит:

<select id="PermissionId" name="PermissionId">
    <option value="">-- Select --</option>
    <option value="1">Permission one</option>
    <option value="2">Permission two</option>
</select>

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

любая помощь приветствуется.


обновление

кажется, это как-то связано с этим статьи. Обобщить решение этой статьи, мне нужно убедиться, что имя свойства (первый аргумент @html.DropDownList) не сопоставьте любые существующие свойства модели. может кто-нибудь объяснить, почему это так?

он отображает выпадающий список правильно, когда я пишу в представлении что-то вроде этого:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions)

однако это не имеет никакого логического смысла, так как я действительно хочу, чтобы binder мог соответствовать имени элемента select свойству model. В противном случае мне пришлось бы вручную захватить значение, как это:Request.Form["PermissionIdNotMatching"];

у кого-нибудь есть какие-нибудь мысли?


решение

см. принятый ответ на первый комментарий к нему.

2 ответов


Хорошо, давайте обсудим ваш пример, когда PermissionId был int. Вы разместили модель типа CreateEditAccountModel для просмотра. Когда вы создали эту модель,PermissionId равно 0 (значение по умолчанию int). И DropDownListFor in view получить это значение. Поэтому у вас не было выбранных значений. При использовании типа string значение по умолчанию PermissionId было null, поэтому ' DropDownListFor принял значение по умолчанию SelectList.

в этом случае лучше использовать int? или Nullable<int> тип PermissionId.


при использовании @Html.DropDownListFor(m => m.PermissionId, Model.Permissions), пожалуйста, убедитесь, что PermissionId уже установлен в вашей модели - это выбранный элемент / id. Кроме того, модель содержит 'избранные':

var query = DatabaseContexts.Select(
            c => new SelectListItem
            {
                Value = c.Key,
                Text = c.Value,
                Selected = c.Key == currentUsed
            });

 PermissionId = that want to select;
 Permissions = query.AsEnumerable();

обновление:

вот полный образец HttpGet:

In HomeController.cs:

[HttpGet]
public ActionResult EditAccount(int id)
{
    CreateEditAccountModel model = new CreateEditAccountModel();

    var permissionsAll = new List<SelectListItem>
         {
             new SelectListItem
                 {
                     Value = "",
                     Text = "--please select--",
                     Selected = false
                 },
             new SelectListItem
                 {
                     Value = "1",
                     Text = "Permission one",
                     Selected = true
                 },
             new SelectListItem
                 {
                     Value = "2",
                     Text = "Permission two",
                     Selected = false
                 }
         };
    model.PermissionId = 1; //add this line
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere....
    return View("EditAccount", model);
}

CreateEditAccountModel.cs:

public class CreateEditAccountModel
{
    [Required]
    [Display(Name = "Permission")]
    public int PermissionId { get; set; }
    public IEnumerable<SelectListItem> Permissions { get; set; }

}

EditAccount.cshtml по:

@using MvcApplication1.Models
@model CreateEditAccountModel
@{
   ViewBag.Title = "EditAccount";
 }

<h2>EditAccount</h2>
@using (Html.BeginForm())
{
   @Html.DropDownListFor(m => m.PermissionId, Model.Permissions)
}

запустите приложение и перейдите в /home/editaccount / 1, раскрывающийся список по умолчанию выберет "разрешение один".

Я думаю, что PermissionId должен быть типом "string" is, System.Сеть.В MVC.SelectedListItem.Значение 'строка'

если вы хотите что-то сделать, когда пользователь выбрал элемент в раскрывающемся списке, Вам может понадобиться [Протоколы HttpPost].

кстати: этой ссылке полезен для вас?