在我的Razor视图中遇到C#问题

时间:2011-08-11 14:30:35

标签: asp.net-mvc asp.net-mvc-3 razor

我有以下代码:

        string init = "yes";
        string html = "";
        foreach (var item in v.Details) {
               if (item.Substring(0, 1) != " ")
               {
                   if (init != "yes")
                   {
                       html += "</ul>";

                   }
                   html += "<p>" + item + "</p><ul>";
               }
               else
               {
                   html += "<li>" + item.Substring(1) + "</li>";
               }
           }

代码在我的MVC控制器中,它创建了一个名为html的字符串。事情是我不认为它应该在控制器中。我试图把它放到视图中,结果发现了一个看似无效的巨大混乱。似乎我不太擅长在剃刀视图中编码C.我刚看到很多语法类型的错误,以及在什么样的C和什么样的HTML之间产生混淆。

任何人都可以建议我如何在视图中使用此代码。这就是我过去所拥有的:

        <ul>
        @foreach (var item in Model.Details)
        {
            <li>@item</li>
        } 
        </ul>

这有效,但正如您所见,我现在需要更多处理。把它从视图中拿出来会更好吗,如果是这样的话,我怎么能这样做呢。我真的希望提供一个视图解决方案,但我对于放置@和#以及放置括号的位置感到困惑。

任何编写C内部或Razor的专家都在那里?

1 个答案:

答案 0 :(得分:4)

  

代码在我的MVC控制器中,它创建了一个名为html的字符串。   事情是我不认为它应该在控制器中

你是对的。它不应该在视图中,也不应该由于它会造成的绝对混乱。我认为这段代码更适合自定义HTML帮助器:

public static class HtmlExtensions
{
    public static IHtmlString FormatDetails(this HtmlHelper htmlHelper, IEnumerable<string> details)
    {
        var init = "yes";
        var html = new StringBuilder();
        foreach (var item in details)
        {
            if (item.Substring(0, 1) != " ")
            {
                if (init != "yes")
                {
                    html.Append("</ul>");
                }
                html.AppendFormat("<p>{0}</p><ul>", htmlHelper.Encode(item));
            }
            else
            {
                html.AppendFormat("<li>{0}</li>", htmlHelper.Encode(item.Substring(1)));
            }
        }
        return MvcHtmlString.Create(html.ToString());
    }
}

您将在视图中调用:

@Html.FormatDetails(Model.Details)

备注:init变量似乎有问题。您最初将其值设置为yes,但以后不会对其进行修改。