代码之家  ›  专栏  ›  技术社区  ›  Webjedi

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

  •  14
  • Webjedi  · 技术社区  · 17 年前

    所以我完全相信ASP.NET、可测试性、SOC、HTML控件的基本原则……这太棒了。但是作为一个新手,我对这个标记有很大的障碍。我知道这是因为我对经典ASP的憎恨,我禁不住觉得自己已经进入了暮色地带 I see this .

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

    12 回复  |  直到 15 年前
        1
  •  11
  •   Community Mohan Dere    9 年前

    您可以做一些事情来帮助清理标记,但我同意它可以得到一点标记soupy。

    例如,这是我做的一个扩展,使一个RSS喷口器在外部:)

      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)%> 这样好多了。

        2
  •  7
  •   Will    17 年前

    1)帮助程序减少HTML噪音
    2)部分视图拆分较大的页面/重用视图代码
    3)尝试不同的渲染引擎,例如 Sparkline
    4)如果视图包含的内容太多,请重构 if 声明。

        3
  •  4
  •   liggett78    17 年前

    Avoiding tag soup 阅读可能会有所帮助。一般来说,您不能使用服务器控件(有些可能会工作),没有回发或视图状态。我不认为您可以使用数据绑定(也可能有例外,我不确定ASP.NET MVC如何处理视图中的服务器控件。)-最简单的方法是将数据列表或数组传递到视图中,并使用foreach从中生成HTML。

        4
  •  1
  •   John Sheehan    17 年前

    移动 一些 (不是全部,只是在有意义的情况下)在模型中显示逻辑(比如日期)。例如,在您的示例中,可以添加一个task.displayDate字符串属性来处理.toshortDateString()调用。然后,如果它发生了变化,您可以在一个地方对其进行全部更改,从而缩短视图中的代码。

    HTML助手有时很好。我真的不喜欢把HTML放在串接的字符串中,或者把StringBuilder放在类的某个地方,但是如果你做了很多可以处理很多不同数据集的工作,它们就不会那么糟糕了。

    我还将更改您的C代码格式首选项,使括号位于同一行。这样就减少了混乱。不幸的是,在代码编辑器和HTML编辑器之间不能有单独的设置,因此您也必须在代码中习惯它。这不是世界上最糟糕的事情。

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

        5
  •  1
  •   Andrew Stanton-Nurse    17 年前

    我喜欢使我的“<%%>!”标记的语法突出显示与背景色非常相似。我的“<%%>!”标签使用黑色背景和银色(手头没有特定颜色的ATM)颜色。再加上这里的其他建议,您的代码应该更易于阅读。当然,你可以尝试另一个视图引擎(这就是MVC的优点!)

        6
  •  1
  •   Almond    17 年前

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

    斯科特·汉塞尔曼在看《星火》和 Nhaml 用一些标记片段,您可以查看它是否适合您的哮喘患者:)

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

        7
  •  0
  •   Schotime    17 年前

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

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

        8
  •  0
  •   John Dunagan    17 年前

    如果您谈论的是呈现控件中的HTML,恐怕它不会变得更好,因为您在MVC中有一个很好的基于标准的包装器。如果没有经过调整的控件,输出仍然是大约1995年的蹩脚嵌套表代码。

    谢谢,微软!

        9
  •  0
  •   Simon_Weaver    17 年前

    使用 服务器端 评论 <%-- 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>
    
            <% } %>
    
        10
  •  0
  •   Simon_Weaver    17 年前

    偶尔使用helper方法(我不是在讨论扩展helper方法)使用HTML对象模型在视图中编写HTML代码。除非你有一些你不容易写在视图中的wierd逻辑,否则我不会重新开始。只要.aspx.cs中的代码是视图代码,就可以了。

    在视图的.aspx文件中:

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

    在视图的“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));
        }
    
        11
  •  0
  •   Soviut    17 年前

    我建议看看单轨铁路使用的速度模板引擎。ASP.NET MVC本身非常接近于单轨格式,因此使用速度模板相当容易。

    Click here to learn more .

        12
  •  0
  •   Andrei Rînea    15 年前

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

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