在ASP.NET MVC中为部分视图创建控制器。
这篇文章讨论了在ASP.NET MVC中创建部分视图的控制器的问题以及解决方法。
问题的原因是,创建部分视图时,没有为其创建一个专门的控制器。相反,可以通过创建一个新的控制器,并在其中创建一个单一的动作来解决这个问题。然后,可以使用RenderAction方法来在部分视图中调用这个控制器和动作。
解决方法是创建一个新的控制器,命名为NewController,并在其中创建一个动作ActionName。然后,在需要使用部分视图的地方,使用RenderAction方法来调用这个动作。
下面是使用RenderAction方法的示例代码:
// Assuming the controller is named NewController
@{Html.RenderAction("ActionName",
"New",
new { routeValueOne = "SomeValue" });
}
这个解决方法可以简化代码,并且让部分视图的功能更加独立。这样,只需要在任何视图或控制器中添加一行代码,就可以使用这个部分视图,而不需要对其他视图或控制器进行修改。
通过创建一个专门的控制器和动作,并使用RenderAction方法来调用它们,可以解决在ASP.NET MVC中创建部分视图的控制器的问题。这种方法简化了代码,并使部分视图的功能更加独立。
在ASP.NET MVC中创建控制器的部分视图的问题是因为需要在一个控制器中生成部分视图。为了解决这个问题,可以使用Html.RenderAction()
方法。通过在任何控制器中放入以下代码,甚至可以创建一个新的控制器:
[ChildActionOnly] public ActionResult MyActionThatGeneratesAPartial(string parameter1) { var model = repository.GetThingByParameter(parameter1); var partialViewModel = new PartialViewModel(model); return PartialView(partialViewModel); }
然后可以创建一个新的部分视图,并使PartialViewModel
成为它的继承类。
对于Razor引擎,视图中的代码块应该是这样的:
@{ Html.RenderAction("Index", "Home"); }
对于WebFormsViewEngine,代码块应该是这样的:
<% Html.RenderAction("Index", "Home"); %>
需要注意的是,RenderAction
是通过发起第二个请求来生成部分视图,而RenderPartial
是作为同一初始请求的一部分生成的。大部分情况下不会有什么问题,但还是值得注意的。有关更多背景信息,请参考stackoverflow.com/questions/719027。
在vbhtml中,当使用.RenderAction("MyActionThatGeneratesAPartial", "Home")
时,会出现"Expression does not produce a value"的错误。正确的写法是将其放在代码块中,像这样:put it inside of a code block。
这对我来说是一个完美的解决方案。我使用return PartialView()
在_Layout视图中渲染一个包含站点标题下拉列表的部分视图,代码如下:PartialView("_AccountsDDL", model);
原因:有人认为在ASP.NET MVC中,为了在网站的任何页面上渲染一个部分视图,需要一个单独的控制器。然而,实际上并不需要一个单独的控制器,可以从任何控制器中渲染部分视图。
解决方法:可以使用.Partial("../ControllerName/_Testimonials.cshtml")
方法来渲染部分视图。只需要确保相对路径是正确的。
可能有人认为这个解决方法不够好,他们认为应该使用一个视图模型来和部分视图一起使用,并将视图模型的创建交给一个单独的专用控制器。然而,这个解决方法并不需要视图模型,它可以让当前(所有)的控制器创建/填充一个视图模型并将其传递给部分视图。
需要注意的是,使用Html.Partial("../ControllerName/_Testimonials.cshtml")
方法时不要忘记添加文件扩展名。