MVC命名空间中的~UrlHelper中的Action方法告诉我们方法重载的重要性(路由的统一)

UrlHelper对象实际上对一个表示请求上下文的RequestContext和路由对象集合的RouteCollection对象的封装,它对外界是只读的,在建立UrlHelper对象时,为它赋值,它的原型是这样:

 public class UrlHelper { 
 public UrlHelper(RequestContext requestContext); public UrlHelper(RequestContext requestContext, RouteCollection routeCollection);  public RequestContext RequestContext { get; } public RouteCollection RouteCollection { get; }

       }
而今天主要说一个它的Action方法的实现,实现MVC模式的路由地址功能,当你调整MVC路由时,它可以自动匹配,比用传统写死的链接要灵活的多,要注意的是,如果用这种方法进行URL传递时,如果信息是被URL编码的,那么在controller的action里接收时,也应该进行URL解码,但如果是写死的链接,那就不需要解码。
以下是Action()方法的原型,供大家参考:
  public string Action(string actionName)

    {

        return this.Action(actionName, null, null, null, null);

    }

    public string Action(string actionName, object routeValues)

    {

        return this.Action(actionName, null, new RouteValueDictionary(routeValues), null, null);

    }

    public string Action(string actionName, string controllerName)

    {

        return this.Action(actionName, controllerName, null, null, null);

    }

    public string Action(string actionName, RouteValueDictionary routeValues)

    {

        return this.Action(actionName, null, routeValues, null, null);

    }

    public string Action(string actionName, string controllerName, object routeValues)

    {

        return this.Action(actionName, controllerName, new RouteValueDictionary(routeValues), null, null);

    }

    public string Action(string actionName, string controllerName, RouteValueDictionary routeValues)

    {

        return this.Action(actionName, controllerName, routeValues, null, null);

    }

    public string Action(string actionName, string controllerName, object routeValues, string protocol)

    {

        return this.Action(actionName, controllerName, new RouteValueDictionary(routeValues), protocol, null);

    }

    public string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName)

    {

        controllerName = controllerName ?? (string)this.RequestContext.RouteData.Values["controller"];

        routeValues = routeValues ?? new RouteValueDictionary();

        routeValues.Add("action", actionName);

        routeValues.Add("controller", controllerName);

        string virtualPath = this.RouteCollection.GetVirtualPath(this.RequestContext, routeValues).VirtualPath;

        if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(hostName))

        {

            return virtualPath.ToLower();

        }



        protocol = protocol??"http";

        Uri uri = this.RequestContext.HttpContext.Request.Url;

        hostName = hostName ?? uri.Host + ":" + uri.Port;            

        return string.Format("{0}://{1}{2}", protocol, hostName, virtualPath).ToLower();

    }
上在的代码是咱们的蒋老大总结出来的,在这里感谢他一下。事实上Action方法有多个重载,这在开发人员调用上容易了不少,大家只调用自己需要的方法即可,不用管没有参数是否要用null代替,这一点,微软告诉我们,做底层架构级开发的话, 要为上级开发人员提供更加友好的,安全的代码展现

你可能感兴趣的:(action)