2009-09-06 106 views
0

O.K.我認爲這很簡單!
我有一個ViewMasterPage的一些鏈接(首頁/關於/登錄/等)。我想要實現的只是當鏈接已被打開時鏈接被禁用(即,如果當前網址是/ Register,那麼註冊鏈接應該被禁用..容易啊!?)
因爲我不喜歡在我的視圖中編寫大量的內聯編碼,最後我用一些擴展方法(只是爲了將代碼保存在.cs文件中)擴展HtmlHelper,並在我的視圖中調用這些方法,下面是我的註冊方法:
禁用當前網址的鏈接?

public static string Register (this HtmlHelper html) 
    { 
     TagBuilder builder ; 
     if (HttpContext.Current.Request.Url.AbsoluteUri.ToUpperInvariant().Contains(MainLinks.Register.ToUpperInvariant())) 
      return MainLinks.Register; // will return the string "Register" 

     builder = new TagBuilder("a"); 
     builder.InnerHtml = MainLinks.Register; 
     builder.AddCssClass("register"); 
     builder.Attributes.Add("href", "/register/"); 
     return builder.ToString(); 
    } 

雖然這個工作,它仍然有兩個問題:

  1. URL的硬編碼字符串值(專門爲家鄉鏈路,因爲我比較AbslouteUri與「http://www.mysite.com/」)

  2. 我的編程本能不喜歡它,我覺得它應該是比簡單得多。

任何想法!


Ps:不允許javascipt!這是一個無JavaScript版本的應用程序。

回答

1

我沒有看到太多的錯誤,很明顯看到它的功能和工作原理。不過,讓它更具可重用性可能會更好,因爲我可以想象你會用其他鏈接重複一下自己。也許是這樣的:

public static string RenderLink(this HtmlHelper html, string text, string url, object htmlAttr) { 
    if (!HttpContext.Current.Request.Url.AbsolutePath.StartsWith(url, StringComparison.InvariantCultureIgnoreCase)) { 
    return text; //comparison excludes the domain 
    } 
    TagBuilder tag = new TagBuilder("a"); 
    tag.SetInnerText(text); 
    tag.Attributes.Add("href", url); 
    //... add attributes parsed as htmlAttr here 
    return tag.ToString(); 
} 

添加您的鏈接到你的觀點一樣:

<%= Html.RenderLink("Register", "/register/", new { @class="register"}) %> 
<%= Html.RenderLink("Account", "/account/", new { @class="account"}) %> 

如果你想從硬編碼的域了,然後用Request.Url.AbsolutePath代替AbsoluteUri如上所述達到此目的。

另一種方法是從控制器解析模型中的當前頁面信息,可能類似於ViewData.Model.CurrentPage =「Register」;,但我不會建議你這樣做,因爲在這種情況下我沒有看到它是控制器的工作。

+0

謝謝DaveG!我會盡量保持乾爽!我會在這裏等一段時間,也許有人提出一個更簡單的想法!再次感謝。 – Galilyou 2009-09-07 06:50:19

+0

哦,我幾乎忘了提及它.. +1 :) – Galilyou 2009-09-07 06:51:07