只需要包含视图的路径和文件扩展名。
剃须刀:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
ASP。NET引擎:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
如果这不是你的问题,你能包括你的代码,用来与RenderUserControl工作吗?
VirtualPathProviderViewEngine是WebFormsViewEngine的基础,它应该支持路径前面的“~”和“/”字符,所以上面的例子应该可以工作。
我注意到你的例子使用了路径“~/Account/myPartial”。ascx”,但是您提到您的用户控件在Views/Account文件夹中。你试过了吗
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
还是你的问题打错了?
对于名为myPartial的用户控件。ascx位于Views/Account文件夹,如下所示:
你应该试试这个
~/Views/Shared/parts/UMFview.ascx
将~/Views/放在代码之前
~/Views/
尝试使用RenderAction("myPartial","Account");
RenderAction("myPartial","Account");
我想出了一个变通办法,看起来效果不错。我发现需要切换到不同控制器的上下文进行动作名称查找、视图查找等。为了实现这一点,我为HtmlHelper创建了一个新的扩展方法:
HtmlHelper
public static IDisposable ControllerContextRegion( this HtmlHelper html, string controllerName) { return new ControllerContextRegion(html.ViewContext.RouteData, controllerName); }
ControllerContextRegion被定义为:
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路由组件不改变,可能会有不必要的副作用,但在我们的代码中,到目前为止,这种方法似乎没有任何负面影响。
controller
在我的情况下,我正在使用MvcMailer (https://github.com/smsohan/MvcMailer),并想从另一个文件夹访问部分视图,这不在“共享”中。上面的解决方案不起作用,但是使用相对路径可以。
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
如果你经常使用其他路径,你可以永久地修复它,而不需要一直指定路径。默认情况下,它会检查“视图”文件夹和“共享”文件夹中的部分视图。但如果你想加一个。
在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());
_options.ViewLocationFormats
public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage) { var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY); var areaName = context.GetNormalizedRouteValue(AREA_KEY); var checkedLocations = new List<string>(); foreach (var location in _options.ViewLocationFormats) { var view = string.Format(location, viewName, controllerName); if (File.Exists(view)) { return ViewEngineResult.Found("Default", new View(view, _ViewRendering)); } checkedLocations.Add(view); } return ViewEngineResult.NotFound(viewName, checkedLocations); }
例如:https://github.com/AspNetMonsters/pugzor
对于使用ASP的读者。NET Core 2.1或更高版本并且想要使用部分标签帮助器语法,试试这个:
<partial name="~/Views/Folder/_PartialName.cshtml" />
波浪号(~)是可选的。
https://learn.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-3.1#partial-tag-helper中的信息也很有用。