gpt4 book ai didi

razor - ASP.NET View 组件 : Remove default path to view

转载 作者:行者123 更新时间:2023-12-04 12:46:44 25 4
gpt4 key购买 nike

我想像这样返回一个具有特定路径的 View ,return View(~/Views/Home)。要返回的类型是 IViewComponentResult

但是,当网站呈现时,它会尝试在以下位置找到 View :Components/{controller-name}/~/Views/Home

所以我想问问你们,是否知道从路径中删除 Components/{controller-name}/ 的聪明方法。我的 View 组件类派生自 ViewComponent 类。

与此相关的问题是,现在您必须有一个“Components”文件夹,其中 Controller 的名称作为包含 Default.cshtml 文件的子文件夹。我不喜欢将所有组件都放在一个文件夹中。我希望你有一个解决方案。

最佳答案

约定发生在 ViewViewComponentResult 中,因此如果您不想要约定,则必须实现自己的 IViewComponentResult

由于 mvc 是开源的,您可以复制所有 ViewViewComponentResult,然后更改约定位。

所以基本上有两件事要做:

  1. 创建您自己的 IViewComponentResult - 让我们称之为 MyViewViewComponentResult
  2. 在您实现的 ViewComponent 中创建一个助手来替换原来的 View() - 目的是返回您在步骤中创建的自定义 MyViewViewComponentResult 1

创建你自己的IViewComponentResult

约定发生在 ExecuteAsync:

public class ViewViewComponentResult : IViewComponentResult
{
// {0} is the component name, {1} is the view name.
private const string ViewPathFormat = "Components/{0}/{1}";
private const string DefaultViewName = "Default";

....

public async Task ExecuteAsync(ViewComponentContext context)
{
....
if (result == null || !result.Success)
{
// This will produce a string like:
//
// Components/Cart/Default
//
// The view engine will combine this with other path info to search paths like:
//
// Views/Shared/Components/Cart/Default.cshtml
// Views/Home/Components/Cart/Default.cshtml
// Areas/Blog/Views/Shared/Components/Cart/Default.cshtml
//
// This supports a controller or area providing an override for component views.
var viewName = isNullOrEmptyViewName ? DefaultViewName : ViewName;
var qualifiedViewName = string.Format(
CultureInfo.InvariantCulture,
ViewPathFormat,
context.ViewComponentDescriptor.ShortName,
viewName);

result = viewEngine.FindView(viewContext, qualifiedViewName, isMainPage: false);
}

....
}

.....
}

所以根据你的需要改变它

在你实现的 ViewComponent 中创建一个助手,它替换了原来的 View

所以基于原来的

/// <summary>
/// Returns a result which will render the partial view with name <paramref name="viewName"/>.
/// </summary>
/// <param name="viewName">The name of the partial view to render.</param>
/// <param name="model">The model object for the view.</param>
/// <returns>A <see cref="ViewViewComponentResult"/>.</returns>
public ViewViewComponentResult View<TModel>(string viewName, TModel model)
{
var viewData = new ViewDataDictionary<TModel>(ViewData, model);
return new ViewViewComponentResult
{
ViewEngine = ViewEngine,
ViewName = viewName,
ViewData = viewData
};
}

你会做类似的事情

/// <summary>
/// Returns a result which will render the partial view with name <paramref name="viewName"/>.
/// </summary>
/// <param name="viewName">The name of the partial view to render.</param>
/// <param name="model">The model object for the view.</param>
/// <returns>A <see cref="ViewViewComponentResult"/>.</returns>
public MyViewViewComponentResult MyView<TModel>(string viewName, TModel model)
{
var viewData = new ViewDataDictionary<TModel>(ViewData, model);
return new MyViewViewComponentResult
{
ViewEngine = ViewEngine,
ViewName = viewName,
ViewData = viewData
};
}

所以将来你会调用 MyView() 而不是 View()

更多信息请查看另一个 SO:Change component view location in Asp.Net 5

关于razor - ASP.NET View 组件 : Remove default path to view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com