DropDownListFor - does not select “Selected” value

谁说胖子不能爱 提交于 2019-12-30 07:59:11

问题


Another one of these questions regarding DropDownListFor not selecting the "Selected" value. Here is code:

Model:

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

Controller:

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

At this point if I put a break point on return line, the model.Permissions contains proper IEnumerable<SelectListItem> object with multiple items and only one, that has Selected = true.

View:

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

Renders:

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

For some reason there is no selected attribute on any of the options and first option is selected.

Any help is appreciated.


UPDATE

It appears it has something to do with this article. To summarize the solution of this article, I need to make sure that the property name (first argument of @html.DropDownList) does not match any existing properties of the model. Can anybody explain why this is the case?

It renders drop down correctly when I write in the view something like this:

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

However, it does not make any logical sense to do it since I actually want binder to be able to match the name of the select element to the model property. Otherwise I'd have to manually grab the value like this: Request.Form["PermissionIdNotMatching"];

Anybody have any thoughts?


SOLUTION

See accepted answer and the first comment to it.


回答1:


Ok, let's discuss about your example, when PermissionId was int. You posted model of type CreateEditAccountModel to view. When you created this model, PermissionId equal 0 (default value of int). And DropDownListFor in view get this value. Therefore you had no selected values. When you used string type, default value of PermissionId was null, therefore `DropDownListFor taken default value of SelectList.

In this case it's better to use int? or Nullable<int> type for PermissionId.




回答2:


When you use @Html.DropDownListFor(m => m.PermissionId, Model.Permissions), please ensure the PermissionId is already set in your Model - that is the selected item / id. In addition, the model contains a 'selected' attribute:

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:

here is a full sample of 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)
}

Run the application and go to /home/editaccount/1, the dropdown will select "Permission one" by default.

I think the PermissionId must be type 'string' is, System.Web.Mvc.SelectedListItem.Value is 'string'

If you would like to do something when user selected item in the dropdown list, you may need [HttpPost].

BTW: this link is useful to you?



来源:https://stackoverflow.com/questions/9832905/dropdownlistfor-does-not-select-selected-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!