【发布时间】:2011-08-28 19:02:38
【问题描述】:
您好,我对 MVC3 和 Razor 还是很陌生,过去几天我一直在努力解决这个问题。我的项目架构师给了我一个任务,即创建一个辅助方法,用于对 MVC 视图中的下拉列表进行排序。我有一个从控制器检索各种数据的视图,并且我正在返回一些我想出现在下拉列表中的值。我被告知不要在 Controller 中对其进行排序,并将我们想要排序的字段传递给辅助方法。我可以像下面那样做,但架构师希望保持视图不受 c 尖锐代码的影响:
@Html.DropDownListFor(model => model.StudyName, new SelectList(ViewBag.StudyTypes, "Value", "Text").OrderBy(l => l.Text))
所以我创建了一些示例代码和一些扩展方法来尝试让它工作。我的想法是复制现有的 Html.DropDownList 方法并允许传递“object htmlAttributes”,这样我就可以将样式设置为方法调用的一部分。
到目前为止,这是我的代码。我在 Edit Controller 方法中返回 ViewBag.StudyTypes 中的下拉数据:
public ActionResult Edit(int id)
{
IEnumerable<SelectListItem> mySelectList = new List<SelectListItem>();
IList<SelectListItem> myList = new List<SelectListItem>();
for (int i = 0; i < 5; i++)
{
myList.Add(new SelectListItem()
{ Value = i.ToString(), Text = "My Item " + i.ToString(), Selected = i == 2 }
);
}
mySelectList = myList;
ViewBag.StudyTypes = mySelectList;
StudyDefinition studydefinition = db.StudyDefinitions.Find(id);
return View(studydefinition);
}
这是我的查看代码:
@model MyStudyWeb.Models.StudyDefinition
@using MyStudyWeb.Helpers
@{
ViewBag.Mode = "Edit";
}
<div>
@Html.DropDownListSorted(new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
@Html.DropDownListSorted("MyList", new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
</div>
最后,下面是我尝试使用的扩展方法。第一个扩展方法什么都不做,我只是在视图中得到一个空白区域。第二种方法有效,但很丑陋。对于第三种方法,我不知道如何指定“order by”参数,因为 IEnumerable 上的 OrderBy 需要 Linq 表达式。
namespace StudyDefinition.Helpers
{
public static class HtmlHelperExtensions
{
// 1st sort method: sort the passed in list and return a new sorted list
public static SelectList DropDownListSorted(this HtmlHelper helper, IEnumerable<SelectListItem> selectList)
{
var x = new SelectList(selectList.ToList()).OrderBy(l => l.Text);
return x as SelectList;
}
// 2nd sort method: return IHtml string and create <select> list manually
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList)
{
StringBuilder output = new StringBuilder();
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
// 3rd sort method: pass in order by parameter - how do I use this?
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList, string orderBy)
{
StringBuilder output = new StringBuilder();
//How do I use the orderBy parameter?
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
}
}
我真的不知道最好的方法,可能有一个更简单的方法,我完全想念了,我可能已经看不到树木了。一些问题
我应该返回 SelectList 还是 MvcHtmlString,还是完全返回其他内容?
对于第一个扩展方法,如何让返回的 SelectList 在 View 中呈现?
如何将参数传递给指定排序顺序的扩展方法?
如何传递“object htmlAttributes”参数,以及如何将此对象/参数应用到 SelectList?
如果有人有一些想法或建议,我将不胜感激:)
【问题讨论】:
标签: asp.net-mvc-3 razor drop-down-menu