如何使用MVC 3.0 RAZOR进行AJAX Get请求?

4

当下拉列表中的选项更改时,我有以下代码:

function ddlSqlList_onchange(listItemId) {
    $.get('/SqlReportList/SqlQuery',         
    { 
        "listItemId": listItemId 
    },
    function (data) { 
        alert('succeeded'); 
        $('#tbSqlQuery').text(data); 
    });}

"SqlReportList"是我的控制器,SqlQuery是一个操作,listItemId是该操作的一个输入参数。
     public string SqlQuery(string listItemId)
            {
// code here
}

本地运行正常,但是部署到开发服务器上就无法正常工作。

我意识到为了让它在服务器上正常工作,URL必须更改为"/ApplicationName/SqlReportList/SqlQuery"。

那么如何在运行时检索应用程序路径呢?


请发布您的路由。 - user596075
尝试使用 @Url.Action() 助手。 - jrummell
1
你的网站是否在 IIS 中作为另一个网站下的(虚拟)应用程序部署? - Magnus
@Magnus 那应该是我的猜测。 - user596075
@Magnus,一个应用程序,不是虚拟目录。 - The Light
4个回答

4
如果您不想写太多的内联JavaScript,那么您可以将URL存储到隐藏字段中,就像这样。
<input type="hidden" id="myGetUrl" value="@(Url.Action("ActionName", "Controller"))" />

在你的JavaScript里面

function ddlSqlList_onchange(listItemId) {
    var url = $('#myGetUrl').val();
    $.get(url,         
    { 
        "listItemId": listItemId 
    },
    function (data) { 
        alert('succeeded'); 
        $('#tbSqlQuery').text(data); 
    }
);}

我需要使用更多的操作,但使用每个隐藏控件并不好。是否可以在JavaScript中编写RAZOR代码? - The Light
@William 这是可能的,但这意味着您必须编写内联JavaScript,也就是说JavaScript位于您的Razor文件内部。如果您想在其他上下文中重用JavaScript代码,则会遇到问题。 - Tx3
1
@William 你可以使用gordatron的答案,这样只有Server.MapPath(“〜”)会在隐藏字段中(甚至可能在Layout文件中)。在JavaScript中,您可以将其与操作组合在一起。$('#path').val() +“Controller / Action” - Tx3

3

您正在使用哪个版本的MVC?

在使用Razor的MVC 3.0中,您可以使用以下内容:

@Url.Action("SqlQuery","SqlReportList")

或者您可以使用:
@Server.MapPath("~")

要获取您的应用程序的基地址并自己构建它。如果有帮助,Server.MapPath也可以在控制器中使用。(似乎Url类也可以在控制器中使用)

(从记忆中)

编辑评论:

如果您在.cshtml文件中,它会像以下内容:

function ddlSqlList_onchange(listItemId) {
    $.get('@Url.Action("SqlQuery","SqlReportList")',         
    { 
        "listItemId": listItemId 
    },
    function (data) { 
        alert('succeeded'); 
        $('#tbSqlQuery').text(data); 
    });}

2
如果OP使用了非侵入式JavaScript(希望如此),那么您不能在其中放置Razor代码。 - user596075
@Shark,好主意。在这种情况下,你能否使用 Razor 页面来生成 JS 文件?否则,你是否必须为每个部署位置单独使用不同的 JS 文件?(也许我漏掉了什么,我不是专家;-) - user359135
@gordatron,我需要将它写在JavaScript函数内。 我认为你的代码不支持这种方式? - The Light
@William 我更新了答案,展示了它的样子,但我还没有测试过。 - user359135

0
如果你正在使用 ASPX,你可以使用以下代码:
$.ajax({
   type: 'POST',
   url: '<%=Url.Action("ActionName","ControllerName")%>',
   data: { dataNameInAction: dataValue },
   success: function () {
         callBack Success Function
   },
   error: function () {
         callbackFaileFunction
   }
});

在服务器端(控制器)上,如果您正在处理Json,可以返回JsonData,例如:
public ActionScript Action(DataType dataNameInAction)
{
..
..

return Json(new { ReturnedData = value, ReturnedData2 = value2 });
}

希望这能帮到你


0
你可以使用window.location.hostname,然后从那里解析出URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接