Asp.net mvc 如何使用MVC避免标记汤?

Asp.net mvc 如何使用MVC避免标记汤?,asp.net-mvc,model-view-controller,Asp.net Mvc,Model View Controller,我读这篇文章是为了证明MVC比普通老php(不使用MVC,即使是经典的asp也可以使用,尽管很痛苦)更合理: 我找不到答案。我认为这是不可避免的得到标签汤。是的,我知道MVC将模型和控制器分开,但是当你看到视图时,一切都变得可怕。我能读的html和标签汤一样好或者更好 我不会使用单元测试,所以它不是那么重要的优势。我不知道我如何才能避免一个丑陋的视图,现在不管我是如何得到它的mvc或只是发出html 我不认为使用所有奇怪的编码(这就是代码)来维护视图比使用response.write”“更容易

我读这篇文章是为了证明MVC比普通老php(不使用MVC,即使是经典的asp也可以使用,尽管很痛苦)更合理:

我找不到答案。我认为这是不可避免的得到标签汤。是的,我知道MVC将模型和控制器分开,但是当你看到视图时,一切都变得可怕。我能读的html和标签汤一样好或者更好

我不会使用单元测试,所以它不是那么重要的优势。我不知道我如何才能避免一个丑陋的视图,现在不管我是如何得到它的mvc或只是发出html

我不认为使用所有奇怪的编码(这就是代码)来维护视图比使用
response.write”“
更容易

例如:

Arnis的回答(对他或其他任何人都没有冒犯)修复了问题中的可怕代码,但对我来说,这看起来仍然很糟糕,或者至少不是我所期望的。对我来说,这些尖括号可能是

我喜欢像codeigniter这样的东西,它确实是我见过的最干净的,但它仍然不是我所期望的。我想我希望MVC中有一些魔力,让一切变得美丽。显然,除非你真的非常小心,否则没有比使用经典asp更好的了,因为它涉及到一个视图

这主要是关于观点。不是关于哪种语言更好,或者谁的模板引擎最好(它们都有相同的标记混淆倾向)

相信我。我想让MVC与我的合作开发者一起工作,所以我根本不反对它作为一种范例。我不能让他们仅仅因为每个人都这么做或诸如此类的事情就同意某件事

谢谢你的评论。我必须能够证明这些事情是正确的,虽然我理解MVC和我得到的东西,但是这种观点让很多事情看起来像是在浪费时间


编辑:一切似乎都是针对一个特定的框架,而不是计划。我看到了一些见解,但最后似乎除了纪律之外没有别的办法了。谢谢大家的回答。

时不时。一次又一次。原始HTML。梦想家。ASP。Word女士。ASP.NET,MVC.NET。我们似乎能触及光谱的两端,但中间没有甜点。

归根结底,也许我们最希望说的是“好吧,至少所有的疯狂都是孤立的。”我说“希望”,因为根据我的经验,说“面向对象”要比用OO所暗示的所有软件原则的优点来做面向对象容易得多

从长远来看,标签汤不是问题。这绝对不是MVC环境下的问题。令人震惊的编码是问题所在。MVC部件像暹罗三胞胎一样融合在一起,清楚地表明在软件设计和编码原则方面的无能是迄今为止最大的犯罪

像RubyonRails或MVC.NET这样的MVC框架将有助于在MVC范例中进行编码时提高编码效率;它本身不会使您的代码编写速度更快。如果你不知道自己到底在做什么,它肯定不会阻止代码维护的噩梦

  • 使用razr视图引擎(我的首选,我认为它看起来更整洁)
    response.write”“
    非常容易编写。但是,您是在一个只控制视图的文件/类中这样做的,并且可以在不接触任何服务逻辑的情况下轻松交换或更改吗?这让我想到了第二点
  • 与您的团队讨论关注点的分离,并确定每个逻辑片段的位置。依赖关系接触点在哪里?是否所有逻辑都在DLL中分组,而这些DLL不了解视图/控制器?从乞讨中做出决定,并把它写在这里
  • 保持视图为视图
  • 不要在视线范围内做任何事情
  • 一旦你在视图中,你就是在查看
  • 我有没有提到观点就是这样
  • 我不嫉妒任何人使用MVP或任何其他模式。但是,如果您想尝试MVC,请正确操作,您会发现重构和维护代码要容易得多


    my 2cents

    视图层优于标记汤的优点是,视图层应将错误逻辑与错误数据隔离开来,从而使根本原因更易于追踪。这不会自动发生,必须烘焙到视图的代码约束中。我见过的关于使用MVC的HTML视图的最佳方法如下(来自):

    • 将数据转换为HTML的代码是显示逻辑
    • 创建或获取随后转换为HTML的数据的代码不是显示逻辑
    了解是成功的一半,一致的实施是成功的另一半。强大的力量带来巨大的责任,因此使用有限的命令子集有助于执行更干净的代码。最低限度的声明将打印并包含。JavaScript库或XSLT可以处理生成表、列表或表单的循环和数据绑定。变量赋值、条件逻辑和字符串操作可以在本地或全局include中完成。其他任何操作都可以由模型或控制器处理。

    请查看查看引擎的使用情况,该引擎包含在MVC 3中。还要尝试将所有逻辑保留在控制器类中,并根据视图中显示的内容构建模型

    • Razor是避免标记汤的一种明显方法,因为在代码和视图引擎计算出C#结束和HTML开始的位置之前,不需要任何
      标记-只需一个
      @

      <span class="name">@Model.Name</span>
      
      Razor还默认为您处理HTML编码,因此您的视图不会充满
      HTML.Encode
      调用。(注意:如果需要输出HTML,可以使用
      HTML.Raw
      helper方法)

    • 将逻辑放入控制器将理想地消除视图中对大型代码块的需要。试试看
      @if(shouldDisplayDiv) {
          <div id="mydiv">Div is displayed!</div>
      }
      
      
      @foreach(User user in Model.Friends) {
          <a href="@user.Url"><img src="@user.ImageUrl" title="@user.Name" /></a>
      }
      
       <div class="specialdiv">@Html.SomeMethod(Model, "String", 5)</div>
      
      <asp:datagrid id="voucherGrid" runat="server" CssClass="dg" CellPadding="2" AutoGenerateColumns="False" DataKeyField="cx_nbr" 
              Width="800px" AllowPaging="True" AllowSorting="True" PageSize="20" OnPageIndexChanged="voucherGrid_PageIndexChanged" 
              OnSortCommand="voucherGrid_SortCommand" OnItemDataBound="voucherGrid_ItemDataBound">
              <SelectedItemStyle CssClass="dgSelectItem"></SelectedItemStyle>
              <AlternatingItemStyle CssClass="dgAlternateItem"></AlternatingItemStyle>
              <ItemStyle CssClass="dgNormalItem"></ItemStyle>
              <HeaderStyle ForeColor="White" CssClass="dgHeader"></HeaderStyle>
      
              <Columns>
                  <asp:TemplateColumn HeaderText="Image">
                      <ItemStyle HorizontalAlign="Center"></ItemStyle>
                      <ItemTemplate>
                          <asp:HyperLink id="voucherImageLink" Target="_blank" runat="server">Image</asp:HyperLink>                                               
                      </ItemTemplate>
                  </asp:TemplateColumn>
                  <asp:BoundColumn DataField="cx_voucher_nbr" SortExpression="cx_voucher_nbr" HeaderText="Call #">
                      <ItemStyle HorizontalAlign="Center"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_pkup_datetime" SortExpression="cx_pkup_datetime" HeaderText="Date" DataFormatString="{0:MM/dd/yyyy}">
                      <ItemStyle HorizontalAlign="Center"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_pass_name" SortExpression="cx_pass_name" HeaderText="Passenger">
                      <ItemStyle Wrap="False"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_pkup_address" SortExpression="cx_pkup_address" HeaderText="Pick-Up">
                      <ItemStyle Wrap="False"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_dest_address" SortExpression="cx_dest_address" HeaderText="Destination">
                      <ItemStyle Wrap="False"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_trip_miles" SortExpression="cx_trip_miles" HeaderText="Miles" DataFormatString="{0:N2}">
                      <ItemStyle HorizontalAlign="Right"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_pkup_datetime" SortExpression="cx_pkup_datetime" HeaderText="Time" DataFormatString="{0:t}">
                      <ItemStyle HorizontalAlign="Center"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_vch_wait_time_amt" SortExpression="cx_vch_wait_time_amt" HeaderText="Wait" DataFormatString="{0:C}">
                      <ItemStyle HorizontalAlign="Right"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_vch_other_amt" SortExpression="cx_vch_other_amt" HeaderText="Other" DataFormatString="{0:C}">
                      <ItemStyle HorizontalAlign="Right"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_vch_admin_charge_amt" SortExpression="cx_vch_admin_charge_amt" HeaderText="Admin Charge" DataFormatString="{0:C}">
                      <ItemStyle HorizontalAlign="Right"></ItemStyle>
                  </asp:BoundColumn>
                  <asp:BoundColumn DataField="cx_vch_fare_amt" SortExpression="cx_vch_fare_amt" HeaderText="Rate" DataFormatString="{0:C}">
                      <ItemStyle HorizontalAlign="Right"></ItemStyle>
                  </asp:BoundColumn>
              </Columns>
      
              <PagerStyle ForeColor="White" CssClass="dgPager" Mode="NumericPages"></PagerStyle>
          </asp:datagrid>
      
      <table id="voucherGrid" class="dg" style="width: 800px;">
         <th class="dgHeader">
            <td>Image</td>
            <td>Call #</td>
            <td>Date</td>
            <td>Passenger</td>
            <td>Pick-Up</td>
            <td>Destination</td>
            <td>Miles</td>
            <td>Time</td>
            <td>Wait</td>
            <td>Other</td>
            <td>Admin Charge</td>
            <td>Rate</td>
         </th>
         @foreach(var voucher in Model.Vouchers) {
         <tr>
            <td>@voucher.Image</td>
            <td>@voucher.CallNum</td>
            <td>@voucher.Date</td>
            <td>@voucher.Passenger</td>
            <td>@voucher.PickUp</td>
            <td>@voucher.Destination</td>
            <td>@voucher.Miles</td>
            <td>@voucher.Time</td>
            <td>@voucher.Wait</td>
            <td>@voucher.Other</td>
            <td>@voucher.AdminCharge</td>
            <td>@voucher.Rate</td>
         </tr>
         }
      </table>