Cia*_*uen 5 razor asp.net-mvc-3 drop-down-menu
嗨,所以我对MVC3和Razor都很陌生,过去几天我一直在努力解决这个问题.我的项目架构师给了我一个任务来创建一个帮助方法来对MVC视图中的下拉列表进行排序.我有一个View从Controller中检索各种数据,我正在返回一些我希望出现在下拉列表中的值.我被告知不要在Controller中对它进行排序,也要将我们想要排序的字段传递给helper方法.我可以像下面这样做,但建筑师希望保持视图没有尖锐的代码:
@Html.DropDownListFor(model => model.StudyName, new SelectList(ViewBag.StudyTypes, "Value", "Text").OrderBy(l => l.Text))
Run Code Online (Sandbox Code Playgroud)
所以我创建了一些示例代码和一些扩展方法来尝试让它工作.我的想法是复制现有的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);
}
Run Code Online (Sandbox Code Playgroud)
这是我的查看代码:
@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>
Run Code Online (Sandbox Code Playgroud)
下面是我试图开始工作的扩展方法.第一个扩展方法什么都不做,我只是在视图中的那个点得到一个空格.第二种方法有点工作,但它很难看.对于第三种方法,我不知道如何指定'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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道最好的方法,可能有一个更简单的方式,我完全失踪,我可能会在我不能再看到树木的地方.一些问题
我应该返回一个SelectList或MvcHtmlString,还是其他完全?
对于第一个扩展方法,如何在View中呈现返回的SelectList?
如何将参数传递给指定排序顺序的扩展方法?
如何传递'object htmlAttributes'参数,以及如何将此对象/参数应用于SelectList?
如果有人有一些想法或建议,那么我会感激一些反馈:)
代码的第一个也是最重要的部分是摆脱任何ViewBag/ViewData(我个人认为是MVC应用程序的癌症)并使用视图模型和强类型视图.
因此,让我们首先定义一个视图模型,该模型将表示我们的视图将使用的数据(在此示例中为dropdownlistg):
public class MyViewModel
{
public string SelectedItem { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以有一个控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
// I am explicitly putting some items out of order
Items = new[]
{
new SelectListItem { Value = "5", Text = "Item 5" },
new SelectListItem { Value = "1", Text = "Item 1" },
new SelectListItem { Value = "3", Text = "Item 3" },
new SelectListItem { Value = "4", Text = "Item 4" },
}
};
return View(model);
}
}
Run Code Online (Sandbox Code Playgroud)
和一个观点:
@model MyViewModel
@Html.DropDownListForSorted(
x => x.SelectedItem,
Model.Items,
new { @class = "foo" }
)
Run Code Online (Sandbox Code Playgroud)
最后一个是帮助方法,它将按值对下拉列表进行排序(您可以根据文本对其进行排序):
public static class HtmlExtensions
{
public static IHtmlString DropDownListForSorted<TModel, TProperty>(
this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> items,
object htmlAttributes
)
{
var model = helper.ViewData.Model;
var orderedItems = items.OrderBy(x => x.Value);
return helper.DropDownListFor(
expression,
new SelectList(orderedItems, "Value", "Text"),
htmlAttributes
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13298 次 |
| 最近记录: |