将值从javascript传递到Action Result

时间:2017-01-14 22:49:52

标签: javascript asp.net-mvc asp.net-mvc-5

我正在尝试将变量形式的javascript传递给动作结果,我没有得到任何错误,但我不能让它工作。

我有以下javascript,当用户选择项目时,他们选择的项目应该传递给操作结果。

.on('select_node.jstree', function (e, data) {
//alert('You selected node: ' + data.node.text);
url.actionURL("/SinqLaison/UpdateItemData", data.node.text);
$.ajax({
    url: '@Url.Action("UpdateItemData", "SinqLaison")',
    type: 'POST',
    data: { query: data.node.text }
});

我尝试将查询传递给

的操作结果
public ActionResult UpdateItemData(string query)
    {
        List<MarketItem> items = new List<MarketItem>();

        SqlConnection connection = new SqlConnection();
        connection.ConnectionString = connString;
        SqlCommand sqlCom = new SqlCommand("SELECT * FROM Items where Id =" + query , connection);
        connection.Open();
        SqlDataReader reader = sqlCom.ExecuteReader();
        while (reader.Read())
        {
            var item = new MarketItem()
            {
                id = Convert.ToInt32(reader["Id"]),
                name = reader["Name"].ToString(),
                marketParentGroup = Convert.ToInt32(reader["MarketGroup"] == DBNull.Value ? 0 : Convert.ToInt32(reader["MarketGroup"])),
                icon = reader["Icon"].ToString()
            };
            items.Add(item);
        }
        connection.Close();

        return View();

我在FireFox调试器中收到以下404错误。我确定动作和控制器是正确的。我的javascript sysntax错了吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

从屏幕截图中看,您的代码看起来像是放在外部javascript文件中。 @Url.Action辅助方法是一种C#方法,需要放在服务器执行的文件中。视图文件就是这个地方。服务器无法执行放置在javascript文件中的C#方法调用。

您需要在视图中执行Url.Action方法并将其传递给外部js文件。

因此,在您的视图文件中,执行Url.Action辅助方法并将该值(相对URL)存储到javascript变量中。在加载具有ajax调用的脚本之前,您需要确保执行此操作。还要确保使用javascript命名空间来避免覆盖邪恶的全局变量。

<script>
    var myProj = myProj || {};
    myProj.urls = myProj.urls || {};
    myProj.urls.updateItemDataUrl='@Url.Action("UpdateItemData", "Home")';    
</script>
<script src="~/Scripts/MyExternalJsFileWhichHasAjaxCode.js"></script>

现在在您的外部JavaScript文件中,您可以像

一样访问它
$.ajax({
    url: myProj.urls.updateItemDataUrl,
    type: 'POST',
    data: { query: 'myTest' }
});