如何在MVC3中使用HTML帮助程序构建html

时间:2012-12-09 07:54:07

标签: html asp.net-mvc asp.net-mvc-3 html-helper

我是这样的帮手,我使用原始HTML在里面创建了这个:

private static readonly Core Db = new Core();
        // Main menu
public static MvcHtmlString MainMenu()
{
    IQueryable<Page> primaryPages = Db.Pages.Where(p => p.IsItShowInMenu);
    var sb = new StringBuilder();
    sb.Clear();
     string pagecode = Convert.ToString(HttpContext.Current.Request.RequestContext.RouteData.Values["url"]);
    sb.Append("<div id=\"Logo\">");
    sb.Append("<a href=\"/\"><span id=\"Logo_Text\">Dr. Shreekumar</span></a> <span id=\"Logo_Sub_Text\">Obstetrician & Gynecologist</span>");
    sb.Append("</div>");
    sb.Append("<div id=\"Primary_Menu\">");
    sb.Append("<ul>");
    foreach (Page page in primaryPages)
    {
        if (page.PageCode != "Home")
        {
             Page currentPage = Db.Pages.SingleOrDefault(p => p.PageCode == pagecode);
             if (currentPage != null)
             {
                  Page parentPage = Db.Pages.Find(currentPage.ParentId);
                  if (parentPage != null)
                  {
                      sb.AppendFormat((page.PageCode == parentPage.PageCode ||
                      page.PageCode == currentPage.PageCode)
                      ? "<li class=\"active\"><a href=\"/pages/{0}\">{1}</a></li>"
                        : "<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,
                              page.Name.Trim());

                  }
                  else
                  {
                     sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,page.Name);
                  }
              }
              else
              {
                  sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode, page.Name);
              }
        }
    }
    sb.Append("</ul>");
    sb.Append("</div>");
    return new MvcHtmlString(sb.ToString());
 }

有人可以建议我如何使用MVC HTML帮助程序(锚点,列表(li),div等帮助程序)转换它

2 个答案:

答案 0 :(得分:3)

作为应用程序的架构师,您的角色的一个重要部分是定义帮助程序生成的内容以及哪些内容不会生成,因为它取决于代码中重复的位置和频率。我不打算告诉你构建助手的原因,因为这取决于整个应用程序的体系结构。但是,为了帮助您做出决定,请考虑您可以构建的两种常规类型的帮助程序:全局和本地。

全局帮助程序用于代码块,这些代码块经常在您的站点上重复,可能会有一些小的更改,可以通过传递不同的参数来处理。本地助手执行相同的工作,但对于给定页面是本地的。具有重复代码段的页面应该实现本地帮助程序。现在......

全球助手:创建一个新的静态类来包含助手。然后,在容器类中创建如下所示的静态方法:

public static MvcHtmlString MyHelper(this HtmlHelper helper, (the rest of your arguments here))
{
    // Create your HTML string.
    return MvcHtmlString.Create(your string);
}

这样做是在Html助手类上创建一个扩展方法,它允许您使用标准Html.语法访问助手。请注意,您必须在要使用自定义帮助程序的任何文件中包含此类的命名空间。

本地帮助程序:当您希望辅助程序在单个视图中是本地帮助时,另一种执行帮助程序的方法。也许你在一个视图中有一段代码被反复重复。您可以使用以下语法;

@helper MyHelper()
{
    // Create a string
    @MvcHtmlString.Create(your string here);
}

然后您可以使用以下方法将其输出到您的页面上:

@MyHelper()

我们始终创建MvcHtmlString对象的原因是因为作为MVC中内置的安全功能,输出的字符串被编码为在页面上以文本形式显示时出现。这意味着<将被编码,以便您实际看到“&lt;”在页面上。默认情况下不会启动HTML标记。

为了解决这个问题,我们使用了MvcHtmlString类,它绕过了这个安全功能,并允许我们直接将HTML输出到页面。

答案 1 :(得分:1)

我建议您将所有这些逻辑移到单独的Section中,因为它是正在呈现的Menu

不是使用代码构建HTML,而是使用Razor的{​​{1}}来构建HTML更简洁,更方便。请参阅Scott Gu的this以及this文章,了解如何渲染各个部分以获得快速入门指南。

考虑使用Helper方法,例如

@Html.DropDownListFor()
helper