如何从另一个文件夹中呈现部分(用户控件)视图?使用预览3我曾经用完整的路径调用RenderUserControl,但是升级到预览5这是不可能的.相反,我们得到了RenderPartial方法,但它没有提供我正在寻找的功能.
只需包含视图的路径,文件扩展名即可.
剃刀:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
ASP.NET引擎:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
如果这不是您的问题,您能否请包含您以前使用RenderUserControl的代码?
在我的情况下,我使用的是MvcMailer(https://github.com/smsohan/MvcMailer),并希望从另一个文件夹访问部分视图,该视图不在"共享"中.上述解决方案不起作用,但使用相对路径.
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
如果您正在使用此其他路径,则可以在很长时间内永久修复此路径,而无需始终指定路径.默认情况下,它检查View文件夹和Shared文件夹中的部分视图.但是说你要加一个.
将类添加到Models文件夹:
public class NewViewEngine : RazorViewEngine { private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] { "~/Views/Foo/{0}.cshtml", "~/Views/Shared/Bar/{0}.cshtml" }; public NewViewEngine() { // Keep existing locations in sync base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray(); } }
然后在Global.asax.cs文件中添加以下行:
ViewEngines.Engines.Add(new NewViewEngine());
对于位于Views/Account文件夹中名为myPartial.ascx的用户控件,请执行以下操作:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
我创建了一种变通方法,似乎工作得很好。我发现需要切换到其他控制器的上下文以进行动作名称查找,视图查找等。为实现此目的,我为以下操作创建了新的扩展方法HtmlHelper
:
public static IDisposable ControllerContextRegion( this HtmlHelper html, string controllerName) { return new ControllerContextRegion(html.ViewContext.RouteData, controllerName); }
ControllerContextRegion
定义为:
internal class ControllerContextRegion : IDisposable { private readonly RouteData routeData; private readonly string previousControllerName; public ControllerContextRegion(RouteData routeData, string controllerName) { this.routeData = routeData; this.previousControllerName = routeData.GetRequiredString("controller"); this.SetControllerName(controllerName); } public void Dispose() { this.SetControllerName(this.previousControllerName); } private void SetControllerName(string controllerName) { this.routeData.Values["controller"] = controllerName; } }
在视图中使用此方法的方式如下:
@using (Html.ControllerContextRegion("Foo")) { // Html.Action, Html.Partial, etc. now looks things up as though // FooController was our controller. }
如果您的代码要求controller
路由组件保持不变,则可能会有不良的副作用,但是到目前为止,在我们的代码中,这种方法似乎没有任何负面影响。