如何在MVC3中使用HTML helpers构建HTML

4
我是一个像这样的助手,我使用以下原始HTML创建了它:

我有一个类似的帮助者,我使用内部的原始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等)来转换这个?

1
你的HTML生成方法中不应该包含任何数据库逻辑。相反,它应该将要呈现的数据作为参数接受。 - Dai
2个回答

3
作为应用程序架构师,定义何时生成帮助器(helpers)以及何时不生成是您角色的重要部分,因为这取决于在您的代码中何处以及多频繁地重复使用它们。我不会告诉您该为哪些构建帮助器,因为这取决于整个应用程序的架构。但是,为了帮助您做出决策,请考虑可以构建的两种常见类型的帮助器:全局和本地。
全局帮助器:创建一个新的静态类来包含您的帮助器。然后,在容器类内创建以下静态方法:
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内置的安全特性,输出的字符串会被编码,以便在页面上显示与文本相同。这意味着一个<将被编码,以便你在页面上实际看到一个"<",它默认不会开始一个HTML标签。
为了解决这个问题,我们使用MvcHtmlString类,该类绕过了这个安全特性,允许我们直接输出HTML到页面上。

1
为什么要点踩?欢迎提出建设性的批评意见。 - Levi Botelho

1

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

不要从代码构建HTML,使用Razorhelper更加清晰和方便。请参考this以及Scott Gu的this文章,了解如何渲染部分以获得快速入门指南。

考虑使用Helper方法,例如

@Html.DropDownListFor()
@Html.DropDownList()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接