从不同的文件夹渲染(不共享)
我怎样才能有一个视图渲染从不同的文件夹的部分(用户控制)? 有了预览版3,我曾经用完整的path调用RenderUserControl,但是升级到预览版5,这是不可能的。 相反,我们得到了RenderPartial方法,但它不提供我正在寻找的function。
只要包含文件扩展名的视图的path。
剃刀:
@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),并希望从另一个文件夹访问不在“共享”的部分视图。; 上述解决scheme不起作用,但使用相对path。
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
如果您正在使用其他path,则可以在很多情况下永久修复此问题,而无需一直指定path。 默认情况下,它将检查View文件夹和Shared文件夹中的部分视图。 但是说你想添加一个。
添加一个类到您的模型文件夹:
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());
对于名为myPartial.ascx的位于Views / Account文件夹的用户控件,可以这样写:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
WebFormsViewEngine所基于的VirtualPathProviderViewEngine应该支持path前面的“〜”和“/”字符,所以上面的示例应该可以工作。
我注意到你的例子使用path“〜/ Account / myPartial.ascx”,但是你提到你的用户控件在Views / Account文件夹中。 你有没有尝试过
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
还是只是在你的问题上的拼写错误?
我已经创build了一个解决方法,似乎工作得很好。 我发现需要切换到不同的控制器的上下文,以查找动作名称,查看查找等。为了实现这个,我为HtmlHelper
创build了一个新的扩展方法:
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
路由组件不改变,可能会有不必要的副作用,但在我们的代码中,目前似乎没有任何负面影响。
你应该试试这个
~/Views/Shared/parts/UMFview.ascx
将~/Views/
放置在你的代码之前
尝试使用RenderAction("myPartial","Account");