ASP.NET MVC:何时使用自定义HTML帮助程序方法与HTML.RenderAction?

ASP.NET MVC:何时使用自定义HTML帮助程序方法与HTML.RenderAction?,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,对于我来说,什么时候使用自定义帮助器方法、什么时候使用渲染以及什么时候只使用ViewData都有点不清楚。它们的一些功能略有重叠 例如,如果我要创建一个类别导航栏,我会创建一个新的助手方法并将其放置在某个局部视图中吗?我最初想这样做,但我在一些博客上读到使用渲染。我一直在反复思考,不仅在这个例子中,而且在一般情况下,我可能需要一些帮助 假设类别列表来自某个数据源。当场景满足以下条件时,我会选择html助手方法: 参数不被视为模型数据 它不必生成过多的标记 html可以只使用给定的参数生成 如果您

对于我来说,什么时候使用自定义帮助器方法、什么时候使用渲染以及什么时候只使用ViewData都有点不清楚。它们的一些功能略有重叠

例如,如果我要创建一个类别导航栏,我会创建一个新的助手方法并将其放置在某个局部视图中吗?我最初想这样做,但我在一些博客上读到使用渲染。我一直在反复思考,不仅在这个例子中,而且在一般情况下,我可能需要一些帮助


假设类别列表来自某个数据源。

当场景满足以下条件时,我会选择html助手方法:

  • 参数不被视为模型数据
  • 它不必生成过多的标记
  • html可以只使用给定的参数生成

  • 如果您有一个使用模型数据的html助手方法,或者它有很多依赖项,那么作为RenderPartial或RenderAction可能会更好。

    我对使用RenderAction也很陌生

    但是当我需要为一个特定的显示加载数据时,我现在就使用 渲染

    非常适合加载标签云,标签云显示在每一页上,但数据并非特定于某一页。

    我遵循的一般准则是:

    HtmlHelper方法:

  • 用于标准化标记。我使用助手确保表单字段、输入按钮和图像标记使用一致的标记
  • 当生成的标记最小时使用。少量文本、表单字段标记等。我不使用帮助程序来呈现完整的域对象
  • 对少量离散参数进行操作。如果我需要迭代一个集合并显示一些内容,这是一个局部过程。如果我需要大量的输入,这也是一个部分
  • 不包含任何业务逻辑,只包含表示逻辑。参数通常是解决方案域中的对象,而不是业务/问题域中的对象
  • 通常范围非常广泛,适用于应用程序的大部分
  • 渲染部分:

  • 当我想将大视图分解为更小的部分时使用。模型应该是“主”视图模型的子集
  • 局部视图通常仅由某些控制器或区域使用
  • 渲染操作:

  • 当我想要创建可以以各种方式组合的功能小块时使用
  • 最常用于生成适用于许多控制器或区域的内容,例如导航控件
  • 查看数据:


    我将使用ViewData跟踪应用于所有视图(如当前用户)的全局数据。如果我需要一种一致的方式来显示这些数据,我通常会为其创建一个partial,然后在母版页中执行RenderPartial()。

    首先,这可能很清楚,但可以这样说:类别业务逻辑(例如,从数据源获取数据)不应该在Html帮助程序或用户控件中:它应该在控制器中完成

    1)RenderPartial/HtmlHelper与2)RenderAction的区别在于此业务逻辑在哪个控制器中:

  • 在一个控制器操作中,执行整个页面或
  • 在特定于局部视图的单独控制器操作中 如果您在几乎每个页面中使用类别数据,我认为在页面控制器操作级别上为每个页面获取类别数据并在视图数据中传递类别数据是正确的。当然,您会使用一些机制(自定义模型基类、扩展控制器等),这样在每个操作中就不会有相同的类别获取函数调用(假设您有很多)

    如果有些页面视图选择显示类别,有些不显示,有些可能有另一个具有不同业务逻辑的类别控件,那么呈现效果肯定更好。即使在上述情况下,RenderAction也很好:它将类别获取与控制器操作中的其他数据分离


    然后是使用RenderPartial还是HtmlHelper。。。对我来说,HtmlHelper应该更通用,而不是特定于特定的视图或模型,但我认为,这更多的是品味问题,而不是MVC角度的明确规则:两者都应该只是视图逻辑。

    你说的是HtmlHelper的扩展方法,对吗?是的,HtmlHelper上的扩展方法。大多数人都同意,附带条件是,当您需要在每个页面中封装一个区域时,RenderAction会更好,并且您不希望为了支持RenderPartial而在每个控制器中重复推送相同的数据(并污染ViewModel对象)。因为RenderAction使用它自己的控制器,所以它更独立,因此更可重用;体现了所有描述领域的良好实践。同意。。。很好的崩溃。我要补充的是,呈现操作通过URI使资源可用。这本身可能是一个理想的(或不太理想的)功能。@jhorback:我的理解是,使用[ChildActionOnly]将阻止通过URI直接访问资源。当您需要一个类似asp控件的帮助函数,并且包含一些业务逻辑,因为您希望在许多项目中重用它时,您会怎么做?是否创建控制器并从帮助器访问它?