从不同的文件夹渲染(不共享)

我怎样才能有一个视图渲染从不同的文件夹的部分(用户控制)? 有了预览版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");