在控制器中调用的等效html.actionlink?

时间:2009-02-03 11:24:52

标签: asp.net-mvc

我正在从控制器设置标题标记:

ViewData["H1"] = "Home > " + category + " > " + subcategory;

我希望主页类别成为网址,这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

你不应该这样做。您的问题是询问如何从控制器创建HTML。控制器不应该创建HTML。这就是观点的意义所在。相反,将类别和子类别传递给视图,并在那里生成HTML:

    public ActionResult Foo()
    {
        ViewData["category"] = "Foo";
        ViewData["subcategory"] = "Bar";
        return View();
    }

<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
    <h3>Home &gt; <%=Html.ActionLink(ViewData["category"]) %>  
             &gt; <%=Html.ActionLink(ViewData["subcategory"]) %></h3>

当然,您可以随意使用强类型模型而不是ViewData字典,但这应该会给您一个大致的想法。

注意:我的原始答案如下。最初提出的问题(见后面的修订版)与现在的问题完全不同。我将离开原来的答案,因为我认为它有一些价值。

在我得到答案之前,如果我没有以不同的方式说出这个例子是错误的话,那将是我的疏忽。

  1. 你是否应该在MVC应用程序中使用它背后的代码,至少是有争议的。
  2. 您当然不应该在视图中设置ViewData。 ViewData应在控制器中设置,读取在视图中。
  3. 现在,话虽如此,在页面代码中调用Html.ActionLink的方法是,嗯,只是调用它。它工作得很好,并返回一个字符串,就像它在aspx中一样。

    但是,这不是我建议做的。相反,为标题做一个帮助:

    1. 创建一个新的静态类。称之为ViewHelpers之类的东西。
    2. 将此类的命名空间添加到web.config
    3. 中的pages-&gt;命名空间部分
    4. 向班级添加新方法,标题(或您喜欢的任何名称)。请参阅下面的示例。
    5. 现在从您的视图中调用帮助程序。再次,请参阅下面的示例。
    6. 示例:

      public static class ViewHelpers
      {
          public static string Header(this HtmlHelper helper, 
              string category, string subcategory)
          {
              return string.Format("Home > {0} > {1}",
                 helper.ActionLink(category),
                 helper.ActionLink(subcategory);
          }
      }
      
      <asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
          <%= Html.Header("foo", "bar") %>
      
      <pages [...]>
        [...]
        <namespaces>
          [...]
          <add namespace="Your.Namespace.ContainingYourClass"/>
        </namespaces>
      </pages>