2012-10-27 31 views
0

我一直在用Html.DropDownListFor和MVC3将我的头撞了两天。DropDownListFor并显示SelectedValue

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

我创建了一个下拉列表区域

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

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

我会建议你使用整数或GUID的ID属性。您也可以从GetAreaLookUpSelectList功能中删除Selected = p.AreaLookUpId == selectedId。这足以在你的控制器动作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 
     }); 
} 
+0

功能SqlFunctions.StringConvert((双)p.AreaLookUpId)只接受小数或双。但你的其他建议奏效了。尽管你缺少“Selected = x.AreaLookUpId == selectedId”。非常感谢 – Tripping

+0

不,我不会错过'Selected = x.AreaLookUpId == selectedId'。我已经明确删除它。下拉列表的选定值是通过'viewModel.UserProfile.Area'值确定的。在您的控制器操作中,您只需将其设置为您想要预选的相应值(您已通过设置“UserProfile”属性完成该操作)。 –

相关问题