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

时间:2008-10-16 12:52:52

标签: c# asp.net-mvc renderpartial

如何让视图从其他文件夹呈现部分(用户控件)? 使用预览3我曾经用完整的路径调用RenderUserControl,但是升级到预览5这是不可能的。 相反,我们得到了RenderPartial方法,但它没有向我提供我正在寻找的功能。

10 个答案:

答案 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" />

波浪号(〜)是可选的。

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-3.1#partial-tag-helper上的信息也很有帮助。

答案 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);
        }

示例:https://github.com/AspNetMonsters/pugzor

答案 9 :(得分:-4)

尝试使用RenderAction("myPartial","Account");