2

我项目中的所有控制器都继承自基本控制器,该控制器具有我的实体模型的属性。

假设我有一个显示世界城市的视图,并且可以选择按国家/地区进行过滤。国家过滤器是数据库中国家的下拉列表。下拉列表的 Html 助手请求一个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 中?)

4

3 回答 3

3

我会将数据作为参数传递给 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-19T07:04:17.143 回答
1

查看 ViewModel 模式,它在 NerdDinner 教程中提到:http: //nerddinnerbook.s3.amazonaws.com/Part6.htm

基本上,您创建一个 ViewModel 类来封装您的视图可能需要的所有数据。因此,您将拥有一个包含所有城市和/或国家的列表的类,以及在控制器操作中实例化/填充的任何其他内容。

然后,您可以强烈键入您的视图以使用该 ViewModel 类,并且 blammo:您已经获得了表单所需的所有数据。

于 2009-05-19T14:00:04.327 回答
0

我认为 html 助手应该返回 html。所以你有两种方法:

首先,如果您想在开始时执行此操作,请从您的 htmlhelper 准备您的元素列表,然后使用初始化列表、选定元素等调用 html.RenderDropDown...

其次,您可以在模型中进行准备,因此控制器将传递带有您需要的所有元素的启动对象,因此在您的视图中您可以直接调用 renderdropdown

干杯

于 2009-05-20T14:37:15.430 回答