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"];
У кого-нибудь есть мысли?
Решение
См. принятый ответ и первый комментарий к нему.
Ответы
Ответ 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: эта ссылка полезна для вас?