使用RouteValueDictionary简化对Asp.net MVC Helper的扩展

Asp.net MVC中提供的大量的Helper,比如下面的Helper:

 

public   static   string  ActionLink( this  HtmlHelper htmlHelper,  string  linkText,  string  actionName,  object  routeValues,  object  htmlAttributes)

 

实际开发中我们也不可避免对Helper进行扩展,比如扩展一个 Link 方法 (MVC本身只提供了ActionLink与RouteLink,对最普通的Link没有扩展)

 

public   static   string  Link( this  HtmlHelper htmlHelper,  string  linkText,  string  linkHref,  object  htmlAttributes)
{
     .
}

 

这里面有个 htmlAttribute ,在C#3.0中就是所谓的“匿名类型”,它可以允许用户调用此方法时这样写:

 

<%= Html.Link( " CaraQ " , " http://www.caraq.com " , new  {@class = " home " ,target = " _blank " })  %>

 

那么在Link方法中如何知道用户到底指定了哪些html属性、值呢?

经过查看MVC源码发现它是使用了一个RouteValueDictionary类,这个类在System.Web.Routing组件中定义的,所以可以如下方式获得用户指定的html属性值:

  

public static string Link(this HtmlHelper htmlHelper, string linkText, string linkHref, object htmlAttributes)
{
     string reval = "<a href=\"{0}\" {1}>{2}</a>";
     StringBuilder builder = new StringBuilder();
     foreach(var item in new RouteValueDictionary(htmlAttributes))
     {
          builder.Append(item.Key + "=\"" + item.Value + "\" ");
     }
     return string.Format(reval,linkHref,builder.ToString(),linkText);
}

你可能感兴趣的:(使用RouteValueDictionary简化对Asp.net MVC Helper的扩展)