在ASP.NET MVC中为部分视图创建控制器

bre*_*njt 60 asp.net asp.net-mvc partial-views

如何为部分视图创建单独的控制器和模型?我希望能够将这个局部视图放在网站的任何位置,这样它就需要它自己的控制器.我当前正在渲染部分

@Html.Partial("_Testimonials")
Run Code Online (Sandbox Code Playgroud)

Geo*_*ker 109

为什么不用Html.RenderAction()

然后你可以将以下内容放入任何控制器(甚至为它创建一个新的控制器):

[ChildActionOnly]
public ActionResult MyActionThatGeneratesAPartial(string parameter1)
{
    var model = repository.GetThingByParameter(parameter1);
    var partialViewModel = new PartialViewModel(model);
    return PartialView(partialViewModel); 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以创建一个新的局部视图,让你PartialViewModel成为它的继承.

对于Razor,视图中的代码块如下所示:

@{ Html.RenderAction("Index", "Home"); }
Run Code Online (Sandbox Code Playgroud)

对于WebFormsViewEngine,它看起来像这样:

<% Html.RenderAction("Index", "Home"); %>
Run Code Online (Sandbox Code Playgroud)

  • 渲染的唯一事情当然是它发出第二个请求,而renderpartial则作为同一个初始请求的一部分.9/10次无关紧要,值得注意.请参阅http://stackoverflow.com/questions/719027/renderaction-renderpartial了解一些背景知识 (3认同)

Jus*_*ner 9

如果是我,我只需创建一个具有单一操作的新Controller,然后使用RenderAction代替Partial:

// Assuming the controller is named NewController
@{Html.RenderAction("ActionName", 
                     "New", 
                      new { routeValueOne = "SomeValue" });
}
Run Code Online (Sandbox Code Playgroud)

  • 在你的代码片段中使用你在答案中描述的`RenderAction'不是更好吗? (3认同)

Sli*_*k86 8

它不需要自己的控制器.您可以使用

@Html.Partial("../ControllerName/_Testimonials.cshtml")
Run Code Online (Sandbox Code Playgroud)

这允许您从任何页面渲染部分.只需确保相对路径正确.

  • 为什么这会被投票?假设是需要一个单独的控制器才能在网站的任何页面上呈现部分控制器.这不是真的.您可以从任何控制器渲染部分.这是一个有效的答案 (4认同)
  • 只是猜测,无论是谁投票,你都可能想要一个视图模型与局部视图一起使用,并将其创建留给一个单独的专用控制器.您的示例在没有viewmodel的情况下运行良好,但强制当前(所有)控制器创建/填充视图模型并将其传递给部分模型 (2认同)