当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从不同文件夹渲染部分(不共享)》经验,为你挑选了5个好方法。

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



1> Elijah Manor..:

只需包含视图的路径,文件扩展名即可.

剃刀:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)

ASP.NET引擎:

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>

如果这不是您的问题,您能否请包含您以前使用RenderUserControl的代码?


我希望我们可以说/ AnotherFolder/Messages
@Simon_Weaver你可以实现这一目标.一种方法是修改ViewEngine并覆盖它的`FindPartialView`方法,例如`if(partialViewName.Contains"/")partialViewName ="〜/ Views /"+ partialViewName;`
也适用于MVC 3 Razor引擎,但如上所述,您需要扩展名(.cshtml).

2> Aaron Sherma..:

在我的情况下,我使用的是MvcMailer(https://github.com/smsohan/MvcMailer),并希望从另一个文件夹访问部分视图,该视图不在"共享"中.上述解决方案不起作用,但使用相对路径.

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)


我发现如果没有最后的.cshtml扩展名,这不起作用.

3> Paul..:

如果您正在使用此其他路径,则可以在很长时间内永久修复此路径,而无需始终指定路径.默认情况下,它检查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());


当然我很久以前就意识到这个问题了.我想我会为未来的Google员工和未来的Bingers添加它.

4> Rahatur..:

对于位于Views/Account文件夹中名为myPartial.ascx的用户控件,请执行以下操作:

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>



5> Jacob..:

我创建了一种变通方法,似乎工作得很好。我发现需要切换到其他控制器的上下文以进行动作名称查找,视图查找等。为实现此目的,我为以下操作创建了新的扩展方法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路由组件保持不变,则可能会有不良的副作用,但是到目前为止,在我们的代码中,这种方法似乎没有任何负面影响。

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有