我的项目中的所有控制器都继承自一个基本控制器,该控制器具有一个带有实体模型的属性。
假设我有一个显示世界上城市的视图,它有一个按国家过滤的选项。国家/地区筛选器是数据库中国家/地区的下拉列表。下拉列表的Html helper请求一个IEnumerable<SelectItem>
。
现在有了这些信息,如果我创建一个如下所示的HtmlHelper
,是否可以:
public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper)
{
return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries
orderby c.Name
select new SelectListItem() {Text = c.Name, Value = c.ID});
}
问题不是我是否可能,而是根据MVC的方式做事情是否可以。(或者我是否应该将ViewData中的国家/地区集合放在控制器中?)
发布于 2009-05-18 23:04:17
我会将数据作为参数传递给GetCountries方法。htmlHelper函数真的不应该知道你的基本控制器的属性-如果有人在一个不是从你的基本控制器继承的控制器上使用它怎么办?我知道我知道,你控制着代码,诸如此类。如果您真的对最佳实践感兴趣,请避免依赖。
public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) {
return from c in countries
order by c.Name
select new SelectListItem
{
Text = c.Name,
Value = c.ID
};
}
然后,在您的视图中:
<%=Html.GetCountries(this.Entities.Countries)%>
发布于 2009-05-19 06:00:04
查看ViewModel模式,它在NerdDinner教程中提到过:http://nerddinnerbook.s3.amazonaws.com/Part6.htm
基本上,您创建了一个ViewModel类,它封装了视图可能需要的所有数据。因此,您应该有一个类,其中包含所有城市和/或国家的列表,以及在控制器操作中实例化/填充的任何其他内容。
然后,您可以强输入视图以使用该ViewModel类,blammo:您已经获得了表单所需的所有数据。
发布于 2009-05-20 06:37:15
我认为html helper应该返回html。因此,您有两种方法:
首先,如果你想这样做,从你的htmlhelper准备你的元素列表,然后调用html.RenderDropDown的初始化列表,选定的元素等…
其次,你可以在你的模型中做好准备,这样控制器将传递初始化的对象和你需要的所有元素,所以在你的视图中你可以直接调用renderdropdown
干杯
https://stackoverflow.com/questions/881294
复制