是否可以跨ASP.NET MVC框架覆盖UrlHelper.GenerateUrl()?

时间:2011-12-13 16:41:24

标签: asp.net-mvc extensibility

方法UrlHelper.GenerateUrl()位于System.Web.Mvc.UrlHelper

我需要一个不同的实现,它会影响从Url.Action()到Html.BeginForm()的所有内容。

这是当前的.NET实现:

    [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
    public static string GenerateUrl(string routeName, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues) { 
        string url = GenerateUrl(routeName, actionName, controllerName, routeValues, routeCollection, requestContext, includeImplicitMvcValues);

        if (url != null) {
            if (!String.IsNullOrEmpty(fragment)) { 
                url = url + "#" + fragment;
            } 

            if (!String.IsNullOrEmpty(protocol) || !String.IsNullOrEmpty(hostName)) {
                Uri requestUrl = requestContext.HttpContext.Request.Url; 
                protocol = (!String.IsNullOrEmpty(protocol)) ? protocol : Uri.UriSchemeHttp;
                hostName = (!String.IsNullOrEmpty(hostName)) ? hostName : requestUrl.Host;

                string port = String.Empty; 
                string requestProtocol = requestUrl.Scheme;

                if (String.Equals(protocol, requestProtocol, StringComparison.OrdinalIgnoreCase)) { 
                    port = requestUrl.IsDefaultPort ? String.Empty : (":" + Convert.ToString(requestUrl.Port, CultureInfo.InvariantCulture));
                } 

                url = protocol + Uri.SchemeDelimiter + hostName + port + url;
            }
        } 

        return url; 
    } 

我知道可以使用委托来覆盖静态方法,但这不允许对来自不同类的相同方法的所有方法调用都使用我的实现而不是默认实现。

1 个答案:

答案 0 :(得分:3)

你要求的是不可能的。如果要修改Url和Html助手的输出,可以编写自定义助手,也可以只更改路径定义。生成URL时,帮助程序使用这些路径定义。如果您对整个应用程序中的网址外观有一些非常具体的要求,您甚至可以编写自定义路由。