MVC 4 JavaScript参数调用操作方法

6

我很疲倦也很愚笨,但这是我的编程问题:

我们正在使用d3.js在MVC4操作方法Live中绘制Google地图元素。我们已经为d3.js元素实现了单击事件,并需要从JavaScript重定向到另一个MVC操作方法。

该操作方法的“声明”如下:

public ActionResult Visualization(String appId = "", String userId = "")

在javascript中,我们在d3.js函数内部有一个代码片段,它的工作方式和外观如下:
.on("click", function (d, i) {
        // just as an example use for the click-event. 
        alert(d.AppName); }

这里的 d 包含了 AppIdUserId

现在我们想要做的是创建一个重定向,调用操作方法并传递来自 d 的参数。这意味着当您单击 d3.js 元素时,您将被重定向到另一个页面,并带有预设参数。

我们尝试过以下方法:

window.location.href = "/StatsLocationController/Visualization/appId=" + d.AppIdentifier + "/userId=" + d.DeviceId

我们还尝试使用window.location.replace(),但都没有成功。我猜我们还没有找到正确的actionLink语法,而在谷歌搜索时也很难找到例子。我们非常感谢任何帮助!

2个回答

9

改为:

window.location.href = Html.ActionLink("Visualization", "StatsLocationController", new{ appId=d.AppId, userId=d.UserId}, new{})

尝试:

window.location.href = '@Url.Action("Visualization", "StatsLocationController", new{ appId=d.AppId, userId=d.UserId})'

假设您已经适当设置了路由? 编辑: 使此操作成功的路由类型类似于:
routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{appId}/{userId}", 
    new {
         controller = "Home", 
         action = "Index", 
         appId = UrlParameter.Optional, 
         userId = UrlParameter.Optional 
    });

第二次编辑

我刚刚注意到你将控制器命名为StatsLocationController - 除非你的C#类也被称为StatsLocationControllerController - 否则这是错误的。Asp.Net MVC默认假设控制器名称是StatsLocationController,所以你应该在引用控制器时省略Controller部分。因此,在这个例子中,你的控制器应该被命名为StatsLocation,这样URL看起来就像这样:

@Url.Action("Visualization", "StatsLocation", new{ appId=d.AppId, userId=d.UserId})

不起作用,在谷歌浏览器控制台中我得到了与html.ActionLink相同的错误。该错误是“预期标识符”,它似乎无法理解我创建的新对象。Visual Studio的智能感知也告诉我,如果我将鼠标悬停在@url上,则“条件编译已关闭”。 - dansv130
路由会是什么样子? - dansv130
你确定已经用引号将调用包裹起来了吗?如果没有,你将无法将一个字符串赋值给href属性,这会导致它崩溃。 - simonlchilds
谢谢您的帮助,由于我的工作日结束了,我明天会进行测试,并在成功运行后将您的答案标记为正确。 - dansv130
最后一件事,@Url.Action是用于HTML的MVC助手,对吧?我需要在JavaScript中创建URL,因为我必须在JavaScript中进行重定向调用。 - dansv130
是的,Url助手是一个对象,它为您提供了访问特定于Url的内容的功能。我想如果您需要在.js文件中使用Url,则需要添加一些脚本来在.cshtml文件中分配变量(假设您正在使用Razor?) - simonlchilds

2

我忘记了没有接受答案。

simonlchilds已经找出了问题,我们在调用中包含了Controller

因此最终呼叫看起来像:

window.location.href = "/StatsLocation/Visualization/appId=" + d.AppIdentifier + "/userId=" + d.DeviceId

其中StatsLocation是控制器的名称。

这是一个愚蠢的错误,但至少它有一个简单的解决方案,也许可以帮助到其他人。


4
你自己回答了自己的问题,并说我的答案解决了问题,然后接受了你自己的答案 - 看起来合理。 - simonlchilds

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