2011-09-05 121 views
1

我几乎整天都在看这个问题,我不知道为什么它不工作。我有以下的控制器动作

public JsonResult GetSubCategory(int category) { 
      //var subCat = db.categories.Where(c => c.parentID == category).Select(c => new {c.ID, c.codeDesc}).ToList(); 
      var subCat = from c in db.categories 
         where c.parentID == category 
         select new 
         { 
          ID = c.ID, 
          codeDesc = c.codeDesc 
         }; 

      return Json(subCat); 
} 

我在查看文件

$("#catList").change(function() { 
    alert("In the change event. cat val is " + $("#catList").val()); 
    var category = $("#catList").val() 
    $.getJSON("/Issues/Search/GetSubCategory", { 'category': category }, 
     function (data) { 
      alert("in the func"); 
      $("#subCatList").options.length = 0; 
      $(data).each(function() { 
       $("<option>").val(this.ID).text(this.codeDesc).appendTo("#subCatList"); 
      }); 
     }); 
}); 

以下jQuery的方法至少,我只是想显示警告信息,但它似乎没有不被显示。我已经尝试了两种构建subCat对象的方法,就像你在上面的控制器代码中看到的一样。调试显示数据正在使用ID和codeDesc字段和值生成,但View端没有任何事情发生。请有人帮忙弄清楚我做错了什么?

谢谢

+1

Sods law !!!!在发布此消息后2秒,我发现在发回Json数据时必须使用POST的信息。所以我改变了上面的调用以使用.ajax()类型设置为POST,它的工作。呼! – SimpleUser

+4

你可以回答你自己的问题,并接受答案(等待一段时间后),所以这个问题可以认为是治疗 – JMax

+2

很高兴它被排序 - 但你实际上不必使用POST。您可以允许使用GET请求调用JsonResult:'return Json(subcat,JsonRequestBehavior.AllowGet)' –

回答

0

如果警报没有发生,这意味着JSON调用失败。尝试添加JSON通话结束后,执行以下操作:

.error(function() { 
    alert("JSON call failed"); 
}); 

如果收到警报后,下一步就是确定为什么JSON电话不能正常工作。

0

可能应该在视图文件的第3行的末尾添加一个分号。

0

,在响应GET请求返回JSON数据的任何行动的结果必须有:

JsonRequestBehavior.AllowGet 

在它的return语句。这是在MS实施中慎重考虑的,通过发送虚假数据来避免与Json相关的攻击。

所以你的情况:

return Json(subCat,JsonRequestBehavior.AllowGet); 

将解决你的问题。

在附注中,会导致这种情况的另一件事是,如果您没有返回正确的MIME类型,但这通常只适用于您的手编码结果处理程序而不是使用MVC。

我的意思是,如果你说你准备好返回HTML(并且服务器返回“Content-type:text/html”),那么你寻找Json的Ajax请求将以同样的方式默默地失败,除非您将响应类型设置为“application/json”

0

其他建议可能问题在于您在列中出现错误。如果看到“错误”的问题是,呼叫不成功

0

谢谢您的帮助的回应,你可以尝试使用

$.ajax({ 
    url: "/Issues/Search/GetSubCategory", 
    data: { 'category': category }, 
    success: function (data) { 
      alert("in the func"); 
      $("#subCatList").options.length = 0; 
      $(data).each(function() { 
       $("<option>").val(this.ID).text(this.codeDesc).appendTo("#subCatList"); 
      });, 
    error: function(){ 
      alert('error'); 
     }, 
    dataType: "json" 
}); 

。正如我在上面的评论中所述,这是因为我没有使用POST选项来调用它。
也正如Jonathon和Shawty所说的,你也可以表明你想要一个GET来返回结果,但是从我读到的这个不被认为是安全的。 (如果你当然不认为这是真的,我想听听你的意见)。

谢谢