2013-03-14 47 views
2

里面我更新我的div元素是局部用的WebGrid一个页面,当我specifiy ajaxUpdateContainerId:在的WebGrid构造函数中我得到的错误:MVC 4 WebGrid和Jquery产生两个错误。 jQuery是未定义和Ajax模型变更后一种错误

的JavaScript运行时错误: 'jQuery的' 未定义

这里是生成的JavaScript错误引用:

<script type="text/javascript"> 
     (function($) { 
      $.fn.swhgLoad = function(url, containerId, callback) { 
       url = url + (url.indexOf('?') == -1 ? '?' : '&') + '__swhg=' + new Date().getTime(); 

       $('<div/>').load(url + ' ' + containerId, function(data, status, xhr) { 
        $(containerId).replaceWith($(this).html()); 
        if (typeof(callback) === 'function') { 
         callback.apply(this, arguments); 
        } 
       }); 
       return this; 
      } 

      $(function() { 
       $('table[data-swhgajax="true"],span[data-swhgajax="true"]').each(function() { 
        var self = $(this); 
        var containerId = '#' + self.data('swhgcontainer'); 
        var callback = getFunction(self.data('swhgcallback')); 

        $(containerId).parent().delegate(containerId + ' a[data-swhglnk="true"]', 'click', function() { 
         $(containerId).swhgLoad($(this).attr('href'), containerId, callback); 
         return false; 
        }); 
       }) 
      }); 

      function getFunction(code, argNames) { 
       argNames = argNames || []; 
       var fn = window, parts = (code || "").split("."); 
       while (fn && parts.length) { 
        fn = fn[parts.shift()]; 
       } 
       if (typeof (fn) === "function") { 
        return fn; 
       } 
       argNames.push(code); 
       return Function.constructor.apply(null, argNames); 
      } 
     })(jQuery); 

这是我的主网页:

@model IEnumerable<PamperWeb.Models.Lab> 

@{ 
    ViewBag.Title = "Index"; 
} 

@Html.Partial("_SubMenu") 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Add Lab", "Create", "Lab", new { patientId = ViewBag.PatientId }, null) 
</p> 
<div id="labs"> 
@Html.Partial("_Completed", Model) 
</div> @section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 
@Scripts.Render("~/bundles/sitespec") 

}

和部分:

@model IEnumerable<PamperWeb.Models.Lab> 

@{ 
    var grid = new WebGrid(Model, ajaxUpdateContainerId: "labs", defaultSort: "Name"); 
} 

@grid.GetHtml(columns: grid.Columns(
grid.Column("Name"), 
grid.Column("Given", header: "Date"), 
grid.Column("TimeGiven", header: "Time"), 
grid.Column("Value"), 
grid.Column("Phase"), 
grid.Column("PatientId"), 
grid.Column("", format: @<text>@Ajax.ActionLink("Disable", "Disable", new { labid = item.Id, patientid = ViewBag.PatientId }, new AjaxOptions { HttpMethod="POST", UpdateTargetId = "labs"})</text>) 
) 
) 

如果我在的WebGrid构造函数中的错误消失删除ajaxUpdateContainerId。但后来当我点击排序我得到一个404寻找我的控制器行动。为什么它会在排序时寻找我的控制器操作?

第二个问题是如果我使用ajax来修改部分,在禁用排序停止工作。如果我在一个html.actionlink排序中取代继续工作。

我有jquery 1.9.1。有任何想法吗?

回答

1

你解决了吗?我在IE中遇到了同样的问题,我可以修复它。我必须将所有已定义的脚本/ css(我的文件位于_Layout.cshtml)移动到捆绑包中(BundleConfig.cs),似乎解决了这个问题。

<head> 
     <meta charset="utf-8" /> 
     <title>@ViewBag.Title - My ASP.NET MVC Application</title> 
     <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />    
     @Styles.Render("~/Content/css") 
     @Scripts.Render("~/bundles/modernizr") 
     @Scripts.Render("~/bundles/jquery") 
     @Scripts.Render("~/bundles/jqueryui") 
    </head> 
3

的问题是,JavaScript解释器运行由它引用jQueryWebGrid生成的脚本。但jQuery当时没有加载,所以你看到'jQuery'是未定义的消息。按照Sheep建议将头文件(@Scripts.Render)加载到jQuery脚本中可以解决问题。

但是,我想知道这是否是微软真正打算的,因为它们默认在页面底部加载jQuery。这通常是有意义的,以避免延迟页面显示。

0

我有使用MVC 4相同的问题VS2012, 我的问题是我不得不将我的@ Scripts.Render指令移动到我的_Layout.cshtml的顶部。这解决了问题

是否有可能@ Scripts.Render指令将jQuery JavaScript文件放在jqGrid文件之后?如果您在浏览器中单击“查看源代码”并查看JavaScript文件包含在页面中的顺序,可以看到这一点。

jQuery代码库必须始终放在jqGrid库之前,这是在非此情况下得到的典型错误消息。