【问题标题】:ASP .NET MVC 3 DropDownListFor problemASP .NET MVC 3 DropDownListFor 问题
【发布时间】:2011-08-08 16:26:15
【问题描述】:

在模型中,我有:

public Guid? Country
{ get; set; }

在视图中,我有:

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

提交时出现错误,导致它想将字符串保存到Guid。如何保存值而不是下拉列表的文本?

【问题讨论】:

  • 作为一种解决方法,您可以添加一个包装 GUID 的 CountryString 属性并设置您的 DropDownListFor 以使用它,但必须有更好的方法。
  • 好的。我稍微更改了代码,这就是我在视图中使用的代码:@Html.DropDownListFor(m => m.Country, new SelectList(ViewBag.Countries, "ID_Country", "ISO_Code"), "" );基本上,我刚刚将 SelectList() 构造函数调用从控制器移至视图。这就是我从控制器(通过实体框架)获取国家到 ViewBag 的方式:ViewBag.Countries = from e in new FarmerEntities().Countries select e;。现在我得到“值不能为空”异常(如果我选择或不选择)。请帮忙!
  • 从外观上看,您使用的是 ISO 国家代码(不是 GUID)。您的国家/地区数据类型是 Guid 而不是字符串是否有原因?
  • 没有。 “ID_Country”用于 DropDownLists 的“隐藏”值列表,“ISO_Code”用于 DropDownLists 的“前”/可见值列表。在提交之前一切正常。

标签: asp.net-mvc razor html-helper


【解决方案1】:

好的。用一点不同的方法让它工作。

型号:

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)
            };
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 2011-04-19
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2011-06-28
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多