Подтвердить что ты не робот

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

Еще один из этих вопросов относительно 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>

По какой-либо причине не выбран выбранный атрибут для любой из опций и выбран первый параметр.

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


UPDATE

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

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

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

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

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


Решение

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

4b9b3361

Ответ 1

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

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

Ответ 2

Когда вы используете @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();

UPDATE:

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

В 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, выпадающее меню по умолчанию выберет "Permission one".

Я думаю, что PermissionId должен быть типом 'string' is, System.Web.Mvc.SelectedListItem.Value является 'string'

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

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