禁用当前网址的链接?

时间:2009-09-06 08:58:34

标签: asp.net-mvc

O.K。我觉得这很简单!
我有一个ViewMasterPage,上面有一些链接(Home / About / Login / etc)。我想要实现的只是在引用url已经打开时禁用链接(即如果当前url是/ Register,则应该禁用Register链接..很容易哈哈!?)
因为我不喜欢在我的视图中编写大量的内联编码,所以我最终使用一些扩展方法扩展HtmlHelper(只是为了将代码保存在.cs文件中)并且在我的视图中我称之为这些方法,这里是以我的登记方法为例:

 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. 网址的硬编码字符串值(特别是主页链接,因为我将AbslouteUri与“http://www.mysite.com/”进行比较)

  2. 我的编程本能不喜欢它,我觉得它应该比那简单得多。

  3. 任何想法!


    Ps:不允许javascipt!这是一个免费的javascript版本的应用程序。

1 个答案:

答案 0 :(得分: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”; ,但我不建议你这样做在这种情况下,我不认为这是控制器的工作。