【问题标题】:ASP.NET MVC: Is a helper allowed to grab data? [closed]ASP.NET MVC:是否允许助手抓取数据? [关闭]
【发布时间】:2009-05-19 06:48:51
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc html-helper


    【解决方案1】:

    我会将数据作为参数传递给 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)%>
    

    【讨论】:

    • 但是如何在我的 ViewPage 中获取国家/地区?我的 ViewPage 中的主要项目是 IEnumerable。所以我应该把 Country 集合放在 ViewData (ViewData["countries"]) 中。您的代码建议您创建一个从原始 ViewPage 继承的新 ViewPage 并添加 Entities 属性(也似乎有很多依赖项)。
    • 您可以创建一个同时包含城市和国家/地区的视图模型。
    • 我觉得有时 ViewModel 很好,但是在每个页面上使用它(因为许多页面由主数据组成,还有一些额外的数据)只会创建这么多 ViewModel,我想知道它是否仍然有利的。
    • 拥有大量 ViewModel 类(如果需要的话)并没有真正的缺点。如果您真的不想要那么多 ViewModel,那么您可以将 Country 集合直接放入 ViewData。您还可以通过继承减少类的总数。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我知道 ViewModel 模式,并且在某些情况下也使用它。但也发现在某些情况下它是一种矫枉过正。我将在很多地方使用这个国家列表,这意味着我必须创建大量的 ViewModel...
    • 可能值得创建一个包含国家/地区的基类,并在必要时从该基类继承。但最终,是的,如果你有很多视图,你将需要很多视图模型。另外,我还没有这样做,但您可以尝试将匿名类型传递给您的视图,然后您可以动态创建 ViewModel。
    【解决方案3】:

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

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

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

    干杯

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 2012-08-26
      • 2013-05-19
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多