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].
кстати: этой ссылке полезен для вас?