2011-08-08 131 views
2

在模型中,我有:ASP .NET MVC 3 DropDownListFor问题

public Guid? Country 
{ get; set; } 

在视图中,我有:

@Html.DropDownListFor(m => m.Country, (SelectList)ViewBag.Countries) 

提交时,错误occures,因为它要保存字符串Guid。如何保存该值而不是下拉列表的文本?

+0

作为解决方法,您可以添加一个'CountryString'属性来封装GUID并设置您的'DropDownListFor'来使用它,但必须有更好的方法。 – Rup

+0

好的。我已经改变了我的代码,这就是我在视图中使用的:@ Html.DropDownListFor(m => m.Country,new SelectList(ViewBag.Countries,“ID_Country”,“ISO_Code”),“” );基本上,我刚刚将控制器的SelectList()构造函数调用移动到视图。这就是我如何通过控制器(通过实体框架)将ViewBag放到ViewBag的国家:ViewBag.Countries = from new FarmerEntities()。Countries select e ;.现在我得到“值不能为空”的例外(如果我选择了某件事)。请帮忙! – Alex

+1

从外观上看,您使用的是ISO国家/地区代码(不是GUID)。您的国家数据类型是Guid而不是字符串是否有原因? –

回答

2

好的。用一点不同的方法来解决问题。

型号:

public UserRegistrationModel() 
{ 
    this.InitializeCountries(); 
} 

private void InitializeCountries() 
{ 
    FarmerEntities fe = new FarmerEntities(); 
    var query = from c in new FarmerEntities().Countries select new { ID = c.ID_Country, Name = c.ISO_Code }; 
    var countries = query.ToSelectList(c => c.ID.ToString(), c => c.Name); 

    this.Countries = countries; 
} 

public Guid? { get; set; } 

public IEnumerable<SelectListItem> Countries 
{ get; set; } 

控制器:

UserRegistrationModel model = new UserRegistrationModel(); 

return View(model); 

查看:

@Html.DropDownListFor(m => m.Country, Model.Countries, "") 

此外,您还需要实现这种扩展

public static class EnumerableExtensions 
{ 
    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector) 
    { 
     return items.ToSelectList(valueSelector, nameSelector, x => false); 
    } 

    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector, IEnumerable<TValue> selectedItems) 
    { 
     return items.ToSelectList(valueSelector, nameSelector, x => selectedItems != null && selectedItems.Contains(valueSelector(x))); 
    } 

    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector, Func<TItem, bool> selectedValueSelector) 
    { 
     foreach (var item in items) 
     { 
      var value = valueSelector(item); 

      yield return new SelectListItem 
      { 
       Text = nameSelector(item), 
       Value = value.ToString(), 
       Selected = selectedValueSelector(item) 
      }; 
     } 
    } 
}