我可以通过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函数使用ActionLink
的OnSuccess
事件?
这是正确的方法吗? 我还有什么我有一个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 } }