【问题标题】:How can i get a select list in MVC without hardcoding properties如何在没有硬编码属性的情况下在 MVC 中获取选择列表
【发布时间】:2015-08-27 09:41:35
【问题描述】:

以下工作正常。问题是我不想硬编码AvailabilityIDAvailabilityName

public ActionResult Create()
{
  SelectList AvailabilityList = new SelectList(db.Availabilities, "AvailabilityID", "AvailabilityName");
  ViewBag.AvailabilityList = AvailabilityList;
  return View();
}

风景来了

 @Html.DropDownListFor(model => model.Availability, (SelectList)ViewBag.AvailabilityList, new
                                {
                                    @class = "red",
                                    data_placeholder = "please choose"
                                })

我应该如何修改上面的代码? 我有 99% 的把握使用 lambda 表达式,所以我也可以添加 order by 子句...但是其他 1% 呢?

谢谢

【问题讨论】:

  • 您必须对其进行硬编码(SelectList 构造函数将string 作为第二和第三个参数。为什么不使用IEnumerable<SelectListItem>
  • @StephenMuecke 实际上我想删除第二个和第三个参数,但如果我这样做,“整个 objext”会显示在视图中。我会尝试 IEnumerable 的事情
  • db.Availabilities.OrderBy(...).Select(x => new SelectListItem() { Value = x.AvailabilityID.ToString(), Text = x.AvailabilityName };

标签: entity-framework asp.net-mvc-4 c#-4.0 linq-to-entities


【解决方案1】:

像这样的小扩展(在静态类中)可以解决问题

public static IEnumerable<SelectListItem> ToSelectListItem<T, TValue, TText>(
            this IEnumerable<T> enumerable,
            Func<T, TText> text,
            Func<T, TValue> value,
            )
        {
            return enumerable.Select(item => new SelectListItem
            {
                Text = text(item).ToString(),
                Value = value(item).ToString(),
            }).AsEnumerable();

用法:

//you can add an OrderBy if needed
var AvailabilityList = db.Availabilities.ToList().ToSelectListItem(m => m.AvailabilityName, m => m.AvailabilityId);

当然,现在是IEnumerable&lt;SelectListItem&gt;,而不是SelectList,但两者都可以与DropDownListFor一起使用

【讨论】:

  • 谢谢先生。我现在在视图中收到以下错误:无法将类型为“WhereSelectListIterator`2[...Availability,System.Web.Mvc.SelectListItem]”的对象转换为类型“System.Web.Mvc.SelectList”。我在这里做错了什么?
  • 只是改变你的看法:(SelectList)ViewBag.AvailabilityList(IEnumerable&lt;SelectListItem&gt;)ViewBag.AvailabilityList
  • 我们不是还在硬编码吗?不同的是它们现在不是字符串
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 2015-12-17
  • 2018-06-05
  • 2021-12-13
  • 2016-09-12
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多