我可以通过Ajax.ActionLink中的OnSuccess事件传递参数吗?

当我使用:

new AjaxOptions { UpdateTargetId = "VoteCount" + indx, OnSuccess = "AnimateVoteMessage" } 

一切工作正常…但我正在试图animation列表中的项目,自动分配的ID。 因为我希望每个这些从我的JavaScript可寻址,我相信我需要传递一个参数给我的JavaScript。 但是当我使用:

 new AjaxOptions { UpdateTargetId = "VoteCount" + indx, OnSuccess = "AnimateVoteMessage(2)" } 

我得到一个“Sys.ArgumentUndefinedException:值不能被定义。” 例外。 那么当我使用MicrosoftMvcAjax.js的debugging版本。 当使用压缩版本时,我得到“Microsoft JScript运行时错误:'b'为空或不是对象”

所以我的问题是,我可以传递一个参数给我的JavaScript函数使用ActionLinkOnSuccess事件?

这是正确的方法吗? 我还有什么我有一个JavaScript函数有能力在我的网页上运行10项(在我的情况下是多个DIV的ID)?

或…有点不同的语法,为我工作:

 OnSuccess = "( function() { MyFunction(arg1,arg2); } )" 

有一个更好的方法来做到这一点 – 使用OnSuccess调用可以传递的内置参数

内置参数(迄今为止我发现的参数)是数据,状态和xhr

数据=从操作方法返回的任何内容

状态=如果成功这个状态只是一个string,说“成功”

xhr =指向一堆javascript的东西,我不会讨论的对象…

所以你可以像这样定义你的javascript(你可以省去你不需要的参数 – 因为我们所需要的只是我们的数据返回,我们只需要数据参数)

 function myOnSuccessFunction (data) { ..do stuff here with the passed in data... } 

就像我之前所说的,数据是ActionResult可能返回的任何JSON,所以如果你的控制器动作方法看起来像这样…

 public ActionResult MyServerAction(Guid modelId) { MyModel mod = new MyModel(modelId); mod.DoStuff(); return Json(mod, JsonRequestBehavior.AllowGet); } 

你会设置你的行动链接像这样…

 @Ajax.ActionLink("Do Stuff", "MyServerAction", new { modelId = Model.Id }, new AjaxOptions { OnSuccess = "mySuccessScript(data);", OnFailure = "myFailureScript();", Confirm = "Are you sure you want to do stuff on the server?" }) 

这将创build一个确认消息框,询问是否要实际调用该操作 – 在提示上单击是将调用对控制器的调用 – 当调用返回时 – 数据参数将包含任何您返回的JSON对象行动方法。 十分简单!

可是等等! 如果我想通过另一个自定义的论点呢? 简单! 只需将您的参数添加到列表的前面…

而不是这个…

 function myOnSuccessFunction (data) { ..do stuff here with the passed in data... } 

做到这一点(如果你喜欢,你可以有多个自定义参数,只要不断添加它们)…

 function myOnSuccessFunction (myCustomArg, data) { ..do stuff here with the passed in data and custom args... } 

那么在你的设置中 – 通过ActionLink定义中的一些客户端脚本获取参数

 @Ajax.ActionLink("DoStuff", "MyServerAction", new { modelId = Model.Id }, new AjaxOptions { OnSuccess = "mySuccessScript(myClientSideArg, data);", OnFailure = "myFailureScript();", Confirm = "Are you sure you want to do stuff on the server?" }) 

请注意,OnSuccess参数中的“myClientSideArg”可以来自您需要的任何地方 – 只需将您的文本replace为您所需的即可。

希望帮助!

有一个更好的方法,我相信这是微软的意图:将AjaxOptions.OnSuccess设置为一个函数指针,即只是函数的名称,没有参数。 MVC会自动发送参数。 下面是一个例子。

JScript参数:

 public class ObjectForJScript { List<int> Ids { get; set; } } 

Jscriptfunction:

 function onFormSuccess(foobar){ alert(foobar); alert(foobar.Ids); alert(foobar.Ids[0]); } 

查看代码:

 @using (Ajax.BeginForm("ControllerAction", "ControllerName", new AjaxOptions { OnSuccess = "onFormSuccess" //see, just the name of our function })) { @Html.Hidden("test", 2) } 

控制器代码:

 public JsonResult ControllerAction(int test) { var returnObject = new ObjectForJScript { Ids = new List<int>{test} }; return Json(returnObject); } 

请注意,JScript函数中的参数名称并不重要,即使控制器将其命名为“returnObject”,也不必将其称为“returnObject”。

另外请注意,Json()方便地将我们的List变成一个JScript数组。 只要C#对象的方法可以转换成Json,就可以象我所做的那样在JScript中调用它们。

最后,控制器不必返回一个JsonResult,它可以是ActionResult(但通常控制器动作只做一件事情会更好)。

上面的例子会提醒两个对象(Json和它包含的数组对象),然后是2。

你可以简单地做到这一点

剃刀:

 ... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')" 

请注意单引号!

JavaScript的:

 function AnimateVoteMessage(YourParameter){ alert(YourParameter); } 

请享用,

试试这个 – 它适用于我:

 OnSuccess = "new Function('MyFunction(" + myParameter + ")')" 

用这个:

 OnSuccess = "function(){yourfunction(" + productcode + ");}" 

要么

 OnSuccess = "function(){yourfunction(this, " + productcode + ");}" 

我也在这个问题上跑了…并没有find解决的办法! 我做了一个解决方法(这是不好的,但现在解决了…也许直到有人在这里发布解决scheme)…我所做的是在TargetId div和OnSuccess中放置一个隐藏的字段,我调用了一个js方法,来自隐藏字段的值< – 这可能发生在您的AnimateVoteMessage方法中…

http://www.codeproject.com/KB/ajax/Parameters-OnSuccess.aspx

基本上:

 function yourCallBack(arg1,arg2) { return function(result) { // Your old function alert(arg1); // param will be accessible here alert(arg2); // param will be accessible here alert(result);// result = the response returned from Ajax } }