2015-12-17 45 views
2

我想通过AJAX传递一些参数来调用MVC控制器操作。
我在这个应用程序中有时做了这个,它工作正常。
我不知道为什么只有这一个不起作用。
Ajax调用MVC控制器返回“未找到”

function excluirDetalhe(button, tab) { 
    var index = $(button).closest('tr').index(); 
    var myTable = document.getElementById(tab); 
    var id = myTable.rows[index].cells[0].innerHTML.trim(); 
    $('#' + tab + ' tr:eq(' + index + ')').remove(); 
     $.ajax({     
      traditional: true, 
      url: "entidades/gravaCookie", 
      type: 'post', 
      data: { id: id, detalhe: "E" }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       alert(errorThrown); 
      } 
    }); 
} 

这是我的控制器方法:

public void gravaCookie(string id, string detalhe) 
{ 
    string key = "een_id"; 
    if (detalhe.Equals("E")) 
     key = "een_id"; 
    if (detalhe.Equals("C")) 
     key = "eco_id"; 
    if (detalhe.Equals("B")) 
     key = "eba_id"; 
    cookie.Values.Add(key, id); 
} 

只是一个提醒,我做正是我在做其他的Ajax调用,但只有这一个尤其是行不通的。
有没有人有任何想法?

+1

您是否有脚本错误?您是否看到404错误讯息? – Shyju

+3

您是否在控制器方法之上有[HttpPost]? – Nate

+0

沿着@Nate所说的话:如果你在gravacookie控制器方法上有[HttpGet],那么你将得到404。 – jnoreiga

回答

7

始终使用Url.ActionUrl.RouteUrl html帮助程序方法将url构建到操作方法。无论您当前的页面/路径如何,它都会正确地构建网址。

假设您的js代码位于剃须刀视图内,您可以直接使用Url.Actio n方法并将其指定给您的js变量。

url: "@Url.Action("gravaCookie","entidades")", 

它应该假设你有一个像这样

[HttpPost] 
public ActionResult gravaCookie(string id,string detalhe) 
{ 
    // to do : Return something 
} 

的操作方法。如果你的JavaScript是JavaScript文件,你可以在你的剃须刀视图中使用上述建立的网址一个单独的内部辅助方法并将其保存在外部js文件代码可以访问的变量中。 这样做时务必确保使用javascript命名空间,以避免全局JavaScript变量可能出现的问题

@section Scripts 
{ 
<script> 
    var myApp = myApp || {}; 
    myApp.Urls = myApp.Urls || {}; 
    myApp.Urls.baseUrl = '@Url.Content("~")'; 
    myApp.Urls.gravaCookieUrl = '@Url.Action("gravaCookie","entidades")'; 
</script> 
<script src="~/Scripts/PageSpecificExternalJsFile.js"></script> 

} 

而在你PageSpecificExternalJsFile.js文件,你可以像

var urlToGrava= myApp.Urls.gravaCookieUrl 
// Or With the base url, you may safely add the remaining url route. 
var urlToGrava2= myApp.Urls.baseUrl+"entidades/gravaCookie"; 
// Use urlToGrava now 

编辑

读它。如果你只是关心网站的根/基础URL,你可以简单地使用/作为您的网址的第一个字符。

var urlToGrava2= "/entidades/gravaCookie"; 
+0

这不会将他的数据传回给方法。 Url.Action所做的就是为该方法创建正确的基础URL,因此他还需要包含数据。 – Nate

+2

@Nate这是不正确的。他将数据传递给'data'属性,并将其正确映射到操作方法参数。如果您有疑问,请随时粘贴代码并查看。我100%肯定。 – Shyju

+0

这也假设他的js在剃刀html页面上。 – Nate

相关问题