2012-01-15 56 views
0

它似乎很简单,但我无法获得任何工作。此代码是由我的模板生成器生成的,需要进行更改。将HREF转换为RouteLink

<li><a href="../Home/Contact" class="active"><span class="l"></span><span class="r"> 
         </span><span class="t">Nous contacter</span></a> </li> 

我最好的选择,到现在是:

<li><span class="l"></span><span class="r"></span> 
@Html.RouteLink("Contact", new { Controller = "Home", Action = "Contact" }, new { @class = "t" })</li> 

但它不会做任何事情。 只是为了让我的问题很清楚:链接在两种情况下都行得通,没关系。格式化不起作用。这是我的问题。

回答

3

第二会产生:

<li> 
    <span class="l"></span> 
    <span class="r"></span> 
    <a class="t" href="/Home/Contact">Contact</a> 
</li> 

比你这或许可以解释的格式问题放在第一位有什么不同:

<li> 
    <a href="../Home/Contact" class="active"> 
     <span class="l"></span> 
     <span class="r"></span> 
     <span class="t">Nous contacter</span> 
    </a> 
</li> 

与HTML辅助,如HTML的问题。 ActionLink和RouteLink是他们总是用Html编码文本,所以你不能使用HTML作为文本。所以,一种可能性是:

<li> 
    <a href="@Url.RouteUrl("Contact", new { controller = "home", action = "contact" })" class="active"> 
     <span class="l"></span> 
     <span class="r"></span> 
     <span class="t">Nous contacter</span> 
    </a> 
</li> 

如果你有很多的产生的另一种可能性是写一个自定义HTML助手会为你做的工作:

public static class HtmlExtensions 
{ 
    public static IHtmlString MyLink(
     this HtmlHelper htmlHelper, 
     string linkText, 
     string routeName, 
     object routeValues 
    ) 
    { 
     var spans = string.Format(
      "<span class=\"l\"></span><span class=\"r\"></span><span class=\"t\">{0}</span>", 
      htmlHelper.Encode(linkText) 
     ); 

     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 
     var url = urlHelper.RouteUrl(routeName, routeValues); 
     var anchor = new TagBuilder("a"); 
     var rvd = new RouteValueDictionary(routeValues); 
     var rd = htmlHelper.ViewContext.RouteData; 
     var currentAction = rd.GetRequiredString("action"); 
     var currentController = rd.GetRequiredString("controller"); 
     var controller = rvd["controller"] as string; 
     var action = rvd["action"] as string; 
     if (string.Equals(controller, currentController, StringComparison.OrdinalIgnoreCase) && 
      string.Equals(action, currentAction, StringComparison.OrdinalIgnoreCase)) 
     { 
      anchor.AddCssClass("active"); 
     } 
     anchor.Attributes["href"] = url; 
     anchor.InnerHtml = spans; 
     return new HtmlString(anchor.ToString()); 
    } 
} 

,然后:

<li> 
    @Html.MyLink("Nous contacter", "Contact", new { controller = "home", action = "contact" }) 
</li> 
+0

工程就像一个魅力。这是一个完整而详尽的解决方案。太感谢了! – Mathieu 2012-01-15 14:55:21

-1

只要使用这样的事情:

@Url.Action("Index", "Home")