gpt4 book ai didi

c# - 将 Controller 操作呈现为字符串(使用虚拟路径,无操作/ Controller 名称)ASP.NET MVC 3

转载 作者:太空宇宙 更新时间:2023-11-03 16:38:54 24 4
gpt4 key购买 nike

好的,我正在开发类似网站的 MVC CMS,并且在声明路由时我使用了以下模式。我像这样将 Action 名称和 Controller 名称封装到一个类中

public class UrlUtilsUnhandledErrorsExtensions
{
private readonly UrlHelper _urlHelper;

public UrlUtilsUnhandledErrorsExtensions(UrlHelper urlHelper)
{
_urlHelper = urlHelper;
}

public String GetLatestErrors()
{
return _urlHelper.Action("GetLatestErrors", "UnhandledErrors");
}
}

然后而不是写

@Url.Action("GetLatestErrors", "UnhandledErrors")

我写

@Url.Action(Url.Utils().UnhandledErrors().GetLatestErrors())

我发现这种方法更易于维护,因为如果 Controller 名称更改,我只需更改一个类。

这适用于任何链接、 Controller 重定向(返回重定向(...))以及任何接受由

返回的虚拟路径的东西
public String GetLatestErrors()
{
return _urlHelper.Action("GetLatestErrors", "UnhandledErrors");
}

但问题来了:我不能通过这种方法使用 Html.Action()。它需要 Controller 名称和操作名称,但我希望它使用虚拟路径。在深入研究 MVC 源代码之后,我意识到我需要编写自己的 Html.Action 扩展方法,它只接受虚拟路径。

这是我的解决方案

    public void ActionFromUrl(this HtmlHelper htmlHelper, String url)
{
RouteValueDictionary rvd = null;

rvd = new RouteValueDictionary();

String action = String.Empty;
String controller = String.Empty;

foreach (Route route in htmlHelper.RouteCollection)
{
if (route.Url == url.Substring(1)) // url starts with / for some reason
{
action = route.Defaults["action"] as String;
controller = route.Defaults["controller"] as String;

break;
}
}

RequestContext rc = ((MvcHandler)HttpContext.Current.CurrentHandler).RequestContext;

rc.RouteData.Values["action"] = action;

rc.RouteData.Values["controller"] = controller;

IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controllerImpl = factory.CreateController(rc, controller);
controllerImpl.Execute(rc);
}

它有效,但由于它基于 Html.RenderAction 方法,它只是直接写入输出,所以在我看来,当我编写以下代码时

@{ Html.ActionFromUrl(Url.Utils().UnhandledErrors().GetLatestErrors()); }

它首先呈现我的部分,高于一切,然后是其余的 html。这不是我想要的结果,所以我必须找出将结果呈现为字符串的方式,就像 Html.Action 那样。我已经使用 dotPeek 查看了源代码,但不知道如何将其完全混合。

我的问题是:我做错了什么吗?或者我如何编写 Html.Action 重载以便它接受虚拟路径并返回 MvcHtmlString?

最佳答案

在 CMS 中,您可能不需要整个基于约定的 View 呈现,您(迟早)会希望将自定义模板呈现为“字符串”并根据您的(很可能是动态/可配置的)规则合并结果布局。查看 RazorEngine 项目。

http://razorengine.codeplex.com/

关于c# - 将 Controller 操作呈现为字符串(使用虚拟路径,无操作/ Controller 名称)ASP.NET MVC 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239481/

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