ASP.NET MVC分组/重用视图功能

时间:2009-09-15 01:17:20

标签: asp.net-mvc

在给定的页面上,让我们说要显示一个窗口,我可能需要一些JavaScript初始化,一些具有特定ID的DIV,并且它们都需要相互链接。 JavaScript可能需要知道DIV的ID,DIV可能需要以某种方式嵌套,依此类推。显然,我不想在我使用该代码的每一页上担心这一点。这会使它容易出错,而不是DRY。

使用WebForms,我会通过编写自定义控件来解决这个问题。你们是如何在你的项目中做到这一点的?您是否正在使用扩展方法吐出字符串,也许是用户控件?推荐的方式是什么?

感谢。

修改

以下是使用母版页时的示例:

  1. 在HEAD内容区域中,我需要一些设置一些功能的jQuery代码
  2. 在一个内容区域中,我会放一些HTML来显示窗口的一部分
  3. 在不同的内容区域中,我会将实际的HTML显示在窗口中。
  4. 因此,所有这3个部分都需要3个不同的代码块,但这些代码块在逻辑上是相互关联的。

    编辑2

    代码示例(使用母版页)

    <asp:Content ContentPlaceHolderID="HeaderContent" runat="server">
       <script type="text/javascript">
         $(document).ready(function() { DoSomething('div1', 'div2'); });
       </script>
    </asp:Content>
    
    <asp:Content ContentPlaceHolderID="TopContent" runat="server">
      <div id='div1'> ... </div>
    </asp:Content>
    
    <asp:Content ContentPlaceHolderID="BottomContent" runat="server">
      <div id='div2'> ... </div>
    </asp:Content>
    

    div1和div2与JavaScript函数调用耦合。如果我犯了错误,给DIV一个不同的ID,代码就会破坏。这是一个证明重点的简单例子。当耦合依赖于具有特定结构的div1时,它会变得更加复杂。

2 个答案:

答案 0 :(得分:2)

您是否可以为此目的利用Site.Master,或者至少是您自己创作的另一位Master?然后,您的所有视图都可以引用此Master并获得初始化的JavaScript和布局元素的好处。

对我来说,如果内容本质上是静态的,这是有道理的。如果没有,我会使用自定义的Html.Init帮助方法。

我想象的是以下内容:

<强> global.js

function doSomething()
{
}

//more code here

母版页

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC 
 "-//W3C//DTD XHTML 1.0 Strict//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>
      <asp:ContentPlaceHolder ID="TitleContent" runat="server" />
    </title>
    <link rel="Stylesheet" href="~/Content/styles.css" />
    <script type="text/javascript" src="global.js"></script>
</head>
<body>
    <div id="customContent">
    </div>
    <div id="content">
        <asp:ContentPlaceHolder ID="MainContent" runat="server" />
    </div>    
</body>
</html>

答案 1 :(得分:1)

您最接近自定义控件的是Partials。它们没有CustomControlls那么强大,因为它们没有事件处理(显然),但它是分离常见html的好方法。