如何让视图从其他文件夹呈现部分(用户控件)? 使用预览3我曾经用完整的路径调用RenderUserControl,但是升级到预览5这是不可能的。 相反,我们得到了RenderPartial方法,但它没有向我提供我正在寻找的功能。
答案 0 :(得分:417)
只需包含视图的路径,文件扩展名即可。
剃刀:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
ASP.NET引擎:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
如果这不是您的问题,请提供您以前使用RenderUserControl的代码吗?
答案 1 :(得分:24)
如果你正在使用这个其他路径,很多时候你可以永久地解决这个问题,而不必一直指定路径。默认情况下,它检查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());
答案 2 :(得分:23)
在我的情况下,我使用的是MvcMailer(https://github.com/smsohan/MvcMailer),并希望从另一个文件夹访问部分视图,该视图不在“共享”中。上述解决方案不起作用,但使用了相对路径。
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
答案 3 :(得分:6)
对于位于Views / Account文件夹中名为myPartial.ascx的用户控件,请按以下方式编写:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
答案 4 :(得分:5)
对于使用ASP.NET Core 2.1或更高版本并希望使用Partial Tag Helper语法的读者,请尝试以下操作:
<partial name="~/Views/Folder/_PartialName.cshtml" />
波浪号(〜)是可选的。
答案 5 :(得分:4)
我已经创建了一个似乎运行良好的解决方法。我发现需要切换到不同控制器的上下文以进行动作名称查找,查看查找等。为实现这一点,我为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
路径组件不要更改,则可能会产生不必要的副作用,但到目前为止,我们的代码中似乎没有任何负面影响。
答案 6 :(得分:3)
WebFormsViewEngine所基于的VirtualPathProviderViewEngine应该支持路径前面的“〜”和“/”字符,因此上面的示例应该可以正常工作。
我注意到您的示例使用路径“〜/ Account / myPartial.ascx”,但您提到您的用户控件位于Views / Account文件夹中。你试过吗
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
或者这只是你问题中的错字?
答案 7 :(得分:0)
你应该试试这个
~/Views/Shared/parts/UMFview.ascx
将~/Views/
放在代码
答案 8 :(得分:0)
创建一个自定义View Engine,并具有一个返回ViewEngineResult的方法
在此示例中,您只需覆盖_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);
}
答案 9 :(得分:-4)
尝试使用RenderAction("myPartial","Account");