我如何克服我对< %%>的恐惧?在我的ASP.Net MVC标记?

时间:2008-12-12 17:15:48

标签: .net asp.net-mvc

所以我完全接受了ASP.NET的基本版本,可测试性,SoC,HTML控件......这太棒了。然而,对于它来说,我有一个巨大的标记挂起。我知道它来自我对经典ASP的仇恨,我不禁觉得我在I see this时进入了暮光区。

我不知道替代方案是什么(我可以使用服务器控件,数据绑定等......?)

12 个答案:

答案 0 :(得分:11)

你可以做一些事情来帮助清理标记,但我同意它可以得到一些标签 - 汤。

  • 您可以make your own HTML helpers使用扩展方法输出数据,这样您就可以隐藏一些if / else逻辑,迭代等等。
  • S trongly type your views,因此您可以ViewData.Model.myProperty而不是(MyClasst)ViewData["foo"].myProperty

例如,这是我制作RSS-spitter-outer的扩展名:)

  public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss) where T : IRSSable
    {
        StringBuilder result = new StringBuilder();

        if (rss.Count() > 0)
        {
            foreach (IRSSable item in rss)
            {
                result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>");
            }
        }

        return result.ToString();
    }

所以在我的前端,我所拥有的是<%=Html.RSSRepeater(mydata)%>,这更好。

答案 1 :(得分:7)

1)助手减少HTML噪音
2)部分视图分解更大的页面/重用视图代码
3)尝试不同的渲染引擎,例如Sparkline
4)如果您的观点包含太多if语句,则为REFACTOR。

答案 2 :(得分:4)

Avoiding tag soup阅读可能会有所帮助。通常,您不能使用服务器控件(有些可能会工作),没有回发或视图状态。我不认为你可以使用数据绑定(再次可能有例外,我不确定ASP.NET MVC如何处理视图中的服务器控件。) - “数据绑定”的最简单方法是传递列表或数组将数据放入视图中并使用foreach从中构建HTML。

答案 3 :(得分:1)

移动一些(并非全部,仅在有意义的情况下)将逻辑(如日期)显示在模型中。例如,在您的示例中,您可以添加处理.ToShortDateString()调用的Task.DisplayDate字符串属性。然后,如果它发生了变化,你可以在一个地方更改它,它会缩短视图中的代码。

HTML帮助程序很好,有时候。我真的不喜欢在连接的字符串中使用我的HTML或者在某个类中使用StringBuilder,但是如果你做了很多可以处理很多不同数据集的事情,那么它们就不会那么糟糕了。

我还会更改您的C#代码格式首选项以在同一行上包含括号。这减少了混乱。遗憾的是,您无法在代码编辑器和HTML编辑器之间对此进行单独设置,因此您也必须在代码中习惯它。这不是世界上最糟糕的事情。

其他人所说的也有帮助:使用部分观点和强类型。

答案 4 :(得分:1)

我喜欢为我的“&lt; %%&gt;”突出显示语法标签非常类似于背景颜色。我的“&lt; %%&gt;”使用黑色背景和银色(手上没有特定的颜色)颜色标签。这加上其他建议应该使您的代码更具可读性。当然,你总是可以尝试另一种视图引擎(这就是MVC之美!)

答案 5 :(得分:1)

我会看一些其他可用的View引擎,我个人非常喜欢Spark view engine,但还有很多其他引擎。

斯科特·汉塞尔曼(Scott Hanselman)做了一篇很棒的帖子,看了一下spark和Nhaml以及一些标记片段,你可以看看它是否适合你的美学:)

http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx

答案 6 :(得分:0)

如果在格式化后按ctrl + z,则只撤消格式化而不是键入。

我发现这有助于将第一个括号与if语句保持在同一行

答案 7 :(得分:0)

如果你是在谈论渲染控件中的HTML,我担心它不会变得更好,因为你在MVC中的View中有一个很好的基于标准的包装器。如果没有适应的控件,输出仍然是大约1995年糟糕的嵌套表代码。

谢谢,微软!

答案 8 :(得分:0)

使用服务器端评论<%-- comment --%>来分隔块并提高可读性。使用额外的行间距来分隔块(由于某种原因,这似乎在于消除我的行间距)。

        <%-- Go through each testimonial --%>
        <% foreach (var testimonial in ViewData.Model.Testimonials) { %>

        <div class="testimonialFrame">
            <div class="testimonialHeader"><%= testimonial.summaryText %></div>


            <%-- Show video if available --%>
            <% if (string.IsNullOrEmpty(testimonial.Video.FullURL) == false) { %>

            <div  style="padding-top:12px">
                <% Html.RenderAction("YouTubeControl", "Application", new { youTubeId = testimonial.Video.FullURL }); %>
            </div>

            <% } %>

            <div class="roundedBox" style="margin-top:15px">
                <div id="txtTestimonialText" class="testimonialText paddedBox"><%= testimonial.TestimonialText %></div>
            </div>

            <div class="testimonialFooter"><%= testimonial.name %></div>
        </div>

        <% } %>

答案 9 :(得分:0)

非常偶尔使用辅助方法(我不是在讨论扩展辅助方法),使用Html对象模型在视图中编写HTML代码。我不推荐这个,除非你有一些你不能轻易写在视图中的奇怪逻辑。只要.aspx.cs中的代码是VIEW代码就可以了。

在View的.aspx文件中:

 <%-- render section --%>
 <% RenderTextSection(section); %>

在View的'codebehind'中,您使用HtmlGenericControl创建HTML,然后使用以下行写出来:

htmlControl.RenderControl(new HtmlTextWriter(Response.Output));

我的完整方法:

protected void RenderTextSection(ProductSectionInfo item)

    {
        HtmlGenericControl sectionTextDiv = new HtmlGenericControl("div");

        bool previousHasBulletPoint = false;
        System.Web.UI.HtmlControls.HtmlControl currentContainer = sectionTextDiv;

        foreach (var txt in item.DescriptionItems)
        {
            if (!previousHasBulletPoint && txt.bp)
            {
                // start bulleted section
                currentContainer = new HtmlGenericControl("UL");
                sectionTextDiv.Controls.Add(currentContainer);
            }
            else if (previousHasBulletPoint && !txt.bp)
            {
                // exit bulleted section
                currentContainer = sectionTextDiv;
            }

            if (txt.bp)
            {
                currentContainer.Controls.Add(new HtmlGenericControl("LI")
                {
                    InnerHtml = txt.t
                });
            }
            else
            {
                currentContainer.Controls.Add(new HtmlGenericControl()
                {
                    InnerHtml = txt.t
                });
            }

            previousHasBulletPoint = txt.bp;
        }

        sectionTextDiv.RenderControl(new HtmlTextWriter(Response.Output));
    }

答案 10 :(得分:0)

我建议查看MonoRails使用的Velocity模板引擎。 ASP.NET MVC在MonoRails格式上非常接近模型,因此使用Velocity模板非常容易。

Click here to learn more

答案 11 :(得分:0)

现在你可以尝试Razor(在ASP.NET MVC 3中)

我只是希望“@”也不会吓到你:P