2011-11-21 27 views
3

我有一个MVC3的HTML帮助,呈现正在被用作搜索控制的HTML的自定义部分。问题是存在JavaScript(jquery),它已经被写入与控件进行交互(它真的应该只用于这个控件)。有没有一种方法可以使JavaScript嵌入,使控件继续具有JavaScript功能。 (通过创建帮助程序,我们可以控制html的结构,并且可以更轻松地编写javascript,这将标准化控件在整个应用程序中的使用。MVC3的HTML帮手和javascript

ex。

<div> 
@Html.SearchControl("searchControlSelector") 
</div> 

<script> 
    $("searchControlSelector").timeout(); 
<script> 

我希望能够调用@ Html.SearchControl([有些PARAMS])时设置的“超时”的功能,这样的JavaScript和帮助相结合和辅助的用户不必担心在调用'超时'时应该使用哪些选择器。有谁知道如何做到这一点?有没有更好的方法来处理这个问题?

回答

1

使用单个共享javascript文件很难制作完全可重用的html助手。

首先,是不能输出每页只有一个<script>$(".searchControl").timeout()</script>代码块,而无需使用额外的方法调用页面布局等

你可以添加自己的特定控制数据属性,如数据搜索控制并在$("input[data-search-control]").timeout()等选择器中使用它来区分只由您的帮助器生成的HTML。

如果在页面上有多个脚本阻塞是可以的,请不要忘记它们会被执行几次,因此您需要关心防止多次执行。您可以使用例如jQuery $("").data()方法将某些数据与脚本已经处理的HTML节点相关联。或者作为选项,您可以检查是否声明了全局范围中的指定对象,如果是,则不做任何事情,否则请声明并调用您的方法。

+0

我添加了他的数据属性,并且在应用程序启动并且工作时将它挂钩了!这是一个好主意。谢谢! –

1

当我想做这样的事情时,我倾向于尽可能保持简单。这里有一些代码听起来像是符合法案的。

using System; 
using System.Text; 
namespace MvcApplication1.Helpers 
{ 
    public class Html 
    { 
     public static string SearchControl(string selector) 
     { 
      StringBuilder returnString = new StringBuilder(); 
      //put your existing code here. 
      returnString.Append(String.Format("<label >{0}</label>", selector)); 
      //just add the JS as string, (wrapped in a 'ready' if you need that) 
      returnString.Append(String.Format("<script>$(function(){$(\"{0}\").timeout();});<script>", selector)); 
      return returnString.ToString(); 
     } 
    } 
} 

如果这没有帮助,请在您的问题中添加更多描述,我们将尽力帮助。