我如何能有一个视图呈现部分(用户控件)从不同的文件夹? 有了预览3,我习惯用完整的路径调用RenderUserControl,但升级到预览5,这是不可能的了。 相反,我们得到了RenderPartial方法,但它没有提供我所寻找的功能。
当前回答
我想出了一个变通办法,看起来效果不错。我发现需要切换到不同控制器的上下文进行动作名称查找、视图查找等。为了实现这一点,我为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.
}
如果您的代码要求控制器路由组件保持不变,那么这种方法可能会产生不必要的副作用,但在我们的代码中,到目前为止,这种方法似乎没有任何负面影响。
其他回答
尝试使用RenderAction("myPartial","Account");
创建一个自定义视图引擎,并有一个返回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
对于名为myPartial的用户控件。ascx位于Views/Account文件夹,如下所示:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
在我的情况下,我正在使用MvcMailer (https://github.com/smsohan/MvcMailer),并想从另一个文件夹访问部分视图,这不在“共享”中。上面的解决方案不起作用,但是使用相对路径可以。
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
VirtualPathProviderViewEngine是WebFormsViewEngine的基础,它应该支持路径前面的“~”和“/”字符,所以上面的例子应该可以工作。
我注意到你的例子使用了路径“~/Account/myPartial”。ascx”,但是您提到您的用户控件在Views/Account文件夹中。你试过了吗
< %。RenderPartial(“~点击量/ Html / myPartial . ascx”);% >账户
还是你的问题打错了?
推荐文章
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- 在ASP中实现请求节流的最佳方法。净MVC吗?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?
- String与StringBuilder