DropDownListFor并显示SelectedValue

时间:2012-10-27 16:22:03

标签: asp.net-mvc-3 html.dropdownlistfor selectedvalue

我现在用Html.DropDownListFor和MVC3敲打了2天。

我成功创建了一个下拉列表并成功更新了数据库 基于它。

我为区域

创建了一个下拉列表
1 - NewYork
2 - London
3 - Paris
etc

创建用户可以更改之前的编辑页面时会出现问题 选择。我试图在下拉列表中显示之前选择的值。

我的代码如下:

控制器:

//
// GET: /MyHome/UpdateProfile

public ActionResult UpdateProfile()
{
    var userProfile = websiteRepository.GetProfileForLoggedUser();
    UpdateProfileViewModel viewModel = new UpdateProfileViewModel
    {
       AreaLookUps = websiteRepository.GetAreaLookUpSelectList(userProfile.Area),
       UserProfile = userProfile
    };
    return View("UpdateProfile", viewModel);
}

GetAreaLookUpSelectList方法

public IEnumerable<SelectListItem> GetAreaLookUpSelectList(int selectedId)
{
   var areaLookUps = from p in db.AreaLookUp
                     orderby p.AreaLookUpDescription
                     select new SelectListItem
                     {
                        Text = p.AreaLookUpDescription,
                        Value = SqlFunctions.StringConvert((double)p.AreaLookUpId),
                        Selected = p.AreaLookUpId == selectedId
                     };
    return areaLookUps;
}

查看

@model NPLHWebsite.ViewModels.UpdateProfileViewModel

<div class="editor-label">
   @Html.LabelFor(model => model.UserProfile.Area)
   @Html.DropDownListFor(model => model.UserProfile.Area, Model.AreaLookUps, "--Select Area--")
</div>

视图模型

public class UpdateProfileViewModel
{
   public UserProfile UserProfile { get; set; }
   public IEnumerable<SelectListItem> AreaLookUps { get; set; }
}

请帮我显示所选值。如果在创建配置文件时选择了该选项,请在下拉列表中说“伦敦”。数据库存储值2表示伦敦。

1 个答案:

答案 0 :(得分:1)

看起来AreaLookUpId属性是double,在与所选值进行比较时会导致问题,因为您使用的是SqlFunctions.StringConvert且格式可能不完全匹配。

我建议你使用整数或guid作为id属性。您也可以从Selected = p.AreaLookUpId == selectedId功能中删除GetAreaLookUpSelectList。将控制器操作中的viewModel.UserProfile.Area属性设置为相应的值(您已经完成)就足够了:

public IEnumerable<SelectListItem> GetAreaLookUpSelectList(int selectedId)
{
    return db
        .AreaLookUp
        .OrderBy(x => x.AreaLookUpDescription)
        .ToList()
        .Select(x => new SelectListItem 
        {
            Value = x.AreaLookUpId.ToString(),
            Text = x.AreaLookUpDescription
        });
}