现在,我试图调用已在ASP.NET
MVC应用程序(即MovieService.svc
)中定义的启用AJAX的Web服务。但是该服务从未在我的getMovies
javascript函数中调用。
如果我在非ASP.NET MVC应用程序中尝试该调用AJAX Web服务的相同技术,则可以正常工作,因此它使我怀疑ASP MVC路由在尝试进行AJAX
Web服务调用时是否会以某种方式干扰事物。
您是否知道为什么没有调用我的Web服务?下面的代码。
<script src="<%= ResolveClientUrl("~/scripts/jquery-1.4.2.min.js") %>" type="text/javascript"></script>
<script src="<%= ResolveClientUrl("~/scripts/grid.locale-en.js") %>" type="text/javascript"></script>
<script src="<%= ResolveClientUrl("~/scripts/jquery-ui-1.8.1.custom.min.js") %>"
type="text/javascript"></script>
<script src="<%= ResolveClientUrl("~/scripts/jquery.jqGrid.min.js") %>" type="text/javascript"></script>
<script type="text/javascript">
var lastsel2;
function successFunction(jsondata) {
debugger
var thegrid = jQuery("#editgrid");
for (var i = 0; i < jsondata.d.length; i++) {
thegrid.addRowData(i + 1, jsondata.d[i]);
}
}
function getMovies() {
debugger
// ***** the MovieService#GetMovies method never gets called
$.ajax({
url: 'MovieService.svc/GetMovies',
data: "{}", // For empty input data use "{}",
dataType: "json",
type: "GET",
contentType: "application/json; charset=utf-8",
success: successFunction
});
}
jQuery(document).ready(function() {
jQuery("#editgrid").jqGrid({
datatype: getMovies,
colNames: ['id', 'Movie Name', 'Directed By', 'Release Date', 'IMDB Rating', 'Plot', 'ImageURL'],
colModel: [
{ name: 'id', index: 'Id', width: 55, sortable: false, hidden: true, editable: false, editoptions: { readonly: true, size: 10} },
{ name: 'Movie Name', index: 'Name', width: 250, editable: true, editoptions: { size: 10} },
{ name: 'Directed By', index: 'Director', width: 250, align: 'right', editable: true, editoptions: { size: 10} },
{ name: 'Release Date', index: 'ReleaseDate', width: 100, align: 'right', editable: true, editoptions: { size: 10} },
{ name: 'IMDB Rating', index: 'IMDBUserRating', width: 100, align: 'right', editable: true, editoptions: { size: 10} },
{ name: 'Plot', index: 'Plot', width: 150, hidden: false, editable: true, editoptions: { size: 30} },
{ name: 'ImageURL', index: 'ImageURL', width: 55, hidden: true, editable: false, editoptions: { readonly: true, size: 10} }
],
pager: jQuery('#pager'),
rowNum: 5,
rowList: [5, 10, 20],
sortname: 'id',
sortorder: "desc",
height: '100%',
width: '100%',
viewrecords: true,
imgpath: '/Content/jqGridCss/redmond/images',
caption: 'Movies from 2008',
editurl: '/Home/EditMovieData/',
caption: 'Movie List'
});
$("#bedata").click(function() {
var gr = jQuery("#editgrid").jqGrid('getGridParam', 'selrow');
if (gr != null)
jQuery("#editgrid").jqGrid('editGridRow', gr, { height: 280, reloadAfterSubmit: false });
else
alert("Hey dork, please select a row");
});
});
</script>
<h2>
<%= Html.Encode(ViewData["Message"]) %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">
http://asp.net/mvc</a>.
</p>
<table id="editgrid">
</table>
<div id="pager" style="text-align: center;">
</div>
<input type="button" id="bedata" value="Edit Selected" />
这是我的RegisterRoutes代码:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("*MovieService.svc*");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
这是我的MovieService类的样子:
namespace jQueryMVC
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MovieService
{
// Add [WebGet] attribute to use HTTP GET
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IList<Movie> GetMovies()
{
return Persistence.GetMovies();
}
}
}
您的主要问题是在ajax
呼叫中使用的不是绝对URL 。错误的输入web.config
也会造成问题。此外,您使用datatype:getMovies
代替datatype: 'json'
和postData:yourData
。datatype
存在as函数的方式(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#function),但是由于jqGrid3.6.5的原因,您可以在其中直接jsonReader
读取数据从Web服务器返回。
更新: 在我看来,我将在稍后描述编辑功能,并在此说明如何获取JSON数据并将其填充到jqGrid中。
首先,jqGrid可以从服务器请求自己的JSON数据。因此,我们不需要单独jQuery.ajax
拨打电话。您只需要定义指向服务器的URL并定义一些jQuery.ajax
您喜欢的其他参数即可。您不会在问题中发布Movie
类的定义。所以我自己定义如下
public class Movie {
public int Id { get; set; }
public string Name { get; set; }
public string Director { get; set; }
public string ReleaseDate { get; set; }
public string IMDBUserRating { get; set; }
public string Plot { get; set; }
public string ImageURL { get; set; }
}
您应该指出,Microsoft序列化的DataTime
类型不是可读的日期字符串,而是作为string
/Date(utcDate)/
,utcDate
此数字在哪里(请参阅jQuery.param()-不序列化javascript
Date对象吗?)。为了一开始减少问题,我将其定义ReleaseDate
为字符串。
方法IList<Movie> GetMovies()
返回JSON数据,就像对象数组一样Movie
。因此,jqGrid作为对HTTP
GET
请求的响应,从MovieService.svc/GetMovies
URL 接收数据,如下所示:
[{"Id":1, "Name": "E.T.", "Director": "Steven Spielberg",...},{...},...]
我可以说这不是等待jqGrid的典型数据格式(与http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data比较)。为了能够将数据放置在jqGrid中,我们必须定义一个jsonReader
。所以我们做以下
jQuery("#editgrid").jqGrid({
url: '<%= Url.Content("~/MovieService.svc/GetMovies")%>',
datatype: 'json',
ajaxGridOptions: { contentType: "application/json" },
jsonReader: { repeatitems: false, id: "Id", root: function(obj) { return obj; }},
headertitles: true,
sortable: true,
colNames: ['Movie Name', 'Directed By', 'Release Date',
'IMDB Rating', 'Plot', 'ImageURL'],
colModel: [
{ name: 'Name', width: 250},
{ name: 'Director', width: 250, align: 'right' },
{ name: 'ReleaseDate', width: 100, align: 'right' },
{ name: 'IMDBUserRating', width: 100, align: 'right' },
{ name: 'Plot', width: 150 },
{ name: 'ImageURL', width: 55, hidden: true }
],
pager: jQuery('#pager'),
pginput: false,
rowNum: 0,
height: '100%',
viewrecords: true,
rownumbers: true,
caption: 'Movies from 2008'
}).jqGrid('navGrid', '#pager', { add: false, edit: false, del: false, search: false });
备注
:我从示例中删除了任何排序参数,因为在请求JSON数据的情况下,排序参数将仅发送到服务器(某些附加参数附加在服务器URL上),并且服务器必须返回已排序的数据。欲了解更多信息,请参阅的说明prmNames
对参数http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options和描述sopt
的参数http://www.trirand.com/jqgridwiki/doku.php?
id =
wiki:singe_searching。
关于datatype: 'json'
我们定义的dataType: 'json'
参数jQuery.ajax
(不要混淆datatype
参数内部的大小写)。colModel
我们内部所有字段的名称
定义与JSON对象内部的字段名称 完全相同
。一些额外的参数viewrecords
,rownumbers
,sortable
和headertitles
在这个例子中不是很重要,我选用那里,因为1)我喜欢那里,2)我将rowNum: 0
做出可能的选项rownumbers: true
工作正确的,而不是告诉我们开始-5负的行号,如果rowNum: 5
喜欢你原始的例子。
通过ajaxGridOptions: { contentType: "application/json" }
我们定义其他参数,这些参数将 直接
转发到jQuery.ajax
。
此示例最复杂的部分是
jsonReader: { repeatitems: false, id: "Id", root: function(obj) { return obj; }}
它定义所有行的id都具有名称“ Id”(请参阅的定义class Movie
)。“ repeatitems: false
”表示我们要通过字段名称(在中定义colModel
)而不是每个位置的默认定义来标识每个数据字段。的定义root
是有点怪,但它定义了如何找到
根 的 行 JSON数据内。以下是JSON数据的默认格式
{
total: "xxx",
page: "yyy",
records: "zzz",
rows : [
{id:"1", cell:["cell11", "cell12", "cell13"]},
{id:"2", cell:["cell21", "cell22", "cell23"]},
...
]
}
行的根定义为root: "rows"
。因此,如果将JSON数据分配给变量res
,则可以将根返回为res.rows
。为了使jqGrid读取我们的数据,我们将其定义jsonReader.root
为一个函数(自jqGrid
3.6.5起存在此功能,请参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:change#additions_and_changes)。您可以验证此奇怪的方法是否有效。典型的附加参数page
,total
(lastpage
),并records
没有内部存在我们的JSON数据,他们将被初始化为以下page:0, total:1, records:0
。因此,我们无法进行数据分页。您可以jsonReader
使用定义的函数page
(total
以及records
(也作为函数))扩展
jsonReader: {
repeatitems: false,
id: "Id",
root: function (obj) { return obj; },
page: function (obj) { return 1; },
total: function (obj) { return 1; },
records: function (obj) { return obj.length; }
}
这将完成我们的jsonReader。然后,rowNum: 0
将不再需要设置。
我展示这种方式只是为了展示jqGrid的灵活性。仅当您访问无法更改的Web服务器时,才应使用描述的方式。jqGrid具有 分页 , 排序 和两种数据_搜索_ (更多的是在相应的SELECT中使用WHERE进行过滤)的功能:简单和高级。如果我们希望在网页上的jqGrid内具有这些出色的功能,则应在WebService中定义其他方法,例如
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json,
UriTemplate = "jqGridGetTestbereiche?_search={_search}&page={page}&"+
"rows={rows}&sidx={sortIndex}&sord={sortDirection}&"+
"searchField={searchField}&searchString={searchString}&"+
"searchOper={searchOper}&filters={filters}")]
public jqGridTable jqGridGetMovies(
int page, int rows, string sortIndex, string sortDirection,
string _search, string searchField, string searchString,
string searchOper, string filters)
哪里 jqGridTable
public class jqGridTable
{
public int total { get; set; } // total number of pages
public int page { get; set; } // current zero based page number
public int records { get; set; } // total number of records
public List<jqGridRow> rows { get; set; }
}
public class jqGridRow
{
public string id { get; set; }
public List<string> cell { get; set; }
}
或者,如果我们要使用从服务器到客户端的最紧凑形式的数据传输,则
// jsonReader: { repeatitems : true, cell:"", id: "0" }
public class jqGridTable {
public int total { get; set; } // total number of pages
public int page { get; set; } // current zero based page number
public int records { get; set; } // total number of records
public List<List<string>> rows { get; set; }// first element in every row must be id of row.
}
(如果您在左侧树形部分中选择“数据映射”,然后选择“数据优化”,则可以在http://www.trirand.com/blog/jqgrid/jqgrid.html上了解有关此类数据传输的更多信息。)
PS:关于jsonReader,您可以在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data上阅读更多内容。我的一个老答案是,在JQGrid中映射JSON数据也可能对您很有趣。
更新2 :因为您没有将答案标记为已接受,所以您会遇到一些问题。因此,我在Visual Studio
2010中创建了一个新项目,以演示我编写的内容。您可以从http://www.ok-soft-
gmbh.com/jqGrid/jQueryMVC.zip下载源。与您的项目进行比较,尤其是将具有完整url的部分作为jqGrid的参数以及将html" target="_blank">web.config的一部分描述为WCF服务接口的部分。
更新3 :我使用VS2010的时间不长。因此,我可以很快将其降级为VS2008。因此,几乎相同的代码都可以在Visual Studio
2008中工作,但是使用ASP.NET MVC 2.0时,您可以从http://www.ok-soft-
gmbh.com/jqGrid/VS2008jQueryMVC.zip下载。ASP.NET MVC
1.0中的代码应该相同,但应修补项目文件中的GUID和Web.config中的某些字符串(请参阅http://www.asp.net/learn/whitepapers/aspnet-
mvc2-升级说明)。
问题内容: 我一直在尝试并尝试学习JQuery,使用AJAX来消费我前一段时间编写的SOAP Web服务。以下是我正在使用的代码: 当前,在Web服务中被调用的方法返回一个类别族数组,其中包含一个类别代码和一个类别描述。由于该方法返回XML,因此我相应地设置了ajax查询。但是,当我运行该应用程序时,我收到一个“错误”警报框- 我确定是什么引起了问题。我知道该Web服务可以正常工作,每天我写的其他
问题内容: 我正在使用像这样的jquery ajax调用: 通话仍然不会转到网络服务。每当我收到错误警报时。可以帮我一下吗? 问题答案: 尝试使用post作为方法类型,大多数Web服务是受保护的,并且需要使用post而不是Get进行转换 另外还可以帮助您调试错误以及错误提示信息。
问题内容: 我有一个愿意输出gzip /压缩数据的Web服务。我已验证该服务将使用wget和curl使用原始JSON或gzip的JSON进行响应。 我想使用jQuery AJAX调用使用此Web服务。 默认情况下,jQuery提供的$ .ajax调用不会添加“ Accept-Encoding:gzip” HTTP请求标头,这对于Web服务器响应gzip压缩的数据是必需的。 但是,当我使用jQuer
如果我直接通过控制器使用play web服务客户端,这些调用可以是异步的,这比我们现在所做的(阻塞)要好得多。然而,我不清楚这到底是如何在重载下的行为。并发/线程管理将主要留给底层的Netty服务器吗?我有什么办法调它吗? 另一种方法是使用控制器中的Akka执行器系统,在这里我可以控制路由策略、池大小、容错等。如果我采用这种方法,那么使用Play的异步WS客户端是否仍然有意义?如果是的话,这种方法
问题内容: 我想以这种方式进行Ajax调用的堆栈:call(n-1)完成后,call(n)开始… 由于多种原因,我无法使用 async:false : 一些请求可能是 jsonp (最相关) 我还有其他一些可能同时起作用的ajax请求。 浏览器被阻止 我无法以这种方式链接我的请求: 因为请求的数量和参数是根据用户输入动态创建的。 一个小例子说明了我的问题。 您将看到服务器响应顺序是随机的,我要实现
问题内容: 我想知道是否可以在Web Worker文件中使用jQuery。谷歌浏览器给我这个错误:“未捕获的ReferenceError:未定义$”。 下面是代码:父文件: 工作文件: 请帮忙,谢谢:) 问题答案: 不,你 不能 。无法访问非线程安全组件或DOM,您必须通过序列化对象将特定数据传入和传出线程。因此,您必须非常努力地在代码中引起问题。 jQuery是一个JavaScript DOM库