当我使用时:
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage"
}
一切正常......但我试图在列表中设置动画,并自动分配ID。由于我希望每个这些都可以通过我的javascript进行寻址,我相信我需要将参数传递给我的javascript。但是当我使用:
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage(2)"
}
我得到一个“Sys.ArgumentUndefinedException:值不能被定义。”例外。我在使用MicrosoftMvcAjax.js的调试版本时得到了。使用压缩版本时,我得到“Microsoft JScript运行时错误:'b'为空或不是对象”
所以我的问题是,我可以使用OnSuccess
的{{1}}事件将参数传递给我的javascript函数吗?
这是正确的做法吗?我怎样才能拥有一个javascript函数,能够在我的页面上运行10个项目(在我的情况下是多个DIV的ID)?
答案 0 :(得分:29)
或......有点不同的语法对我有用:
OnSuccess = "( function() { MyFunction(arg1,arg2); } )"
答案 1 :(得分:29)
有一种更好的方法 - 使用OnSuccess调用可以传递的内置参数
内置参数(我到目前为止找到的参数)是数据,状态和xhr
data =您从操作方法返回的任何内容
status =如果成功,此状态只是一个表示“成功”的字符串
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?" })
这将创建一个确认消息框,询问您是否要实际调用该操作 - 在提示符上单击是将调用对控制器的调用 - 当调用返回时 - data参数将包含任何您的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”可以来自您需要的任何位置 - 只需将此文本替换为您需要的内容。
希望有帮助!
答案 2 :(得分:9)
有一种更好的方法,我相信是微软的意图:将AjaxOptions.OnSuccess设置为函数指针,即只是函数的名称,没有参数。 MVC将自动发送参数。以下是一个例子。
JScript参数:
public class ObjectForJScript
{
List<int> Ids { get; set; }
}
Jscript功能:
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”。
另请注意,Json()可以方便地将List转换为JScript数组。只要C#对象的方法可以转换为Json,就可以像我一样在JScript中调用它们。
最后,控制器不必返回JsonResult,它可以是ActionResult(但通常更好的控制器操作只做一件事。)
以上示例将警告两个对象(Json及其包含的数组对象),然后是2.
答案 3 :(得分:8)
你可以简单地这样做
剃刀:
... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')"
请注意单引号!
JavaScript的:
function AnimateVoteMessage(YourParameter){
alert(YourParameter);
}
享受,
答案 4 :(得分:6)
试试这个 - 它对我有用:
OnSuccess = "new Function('MyFunction(" + myParameter + ")')"
答案 5 :(得分:3)
使用此:
OnSuccess = "function(){yourfunction(" + productcode + ");}"
或
OnSuccess = "function(){yourfunction(this, " + productcode + ");}"
答案 6 :(得分:0)
我也遇到了这个问题......并没有找到解决方法! 我做了一个解决方法(这不是很好,但现在解决了......也许直到有人在这里发布解决方案)... 我所做的是在TargetId div和OnSuccess中放置一个隐藏字段我调用了一个js方法,它从隐藏字段中检索值&lt; - 这可能发生在你的AnimateVoteMessage方法......
答案 7 :(得分:0)
请参阅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
}
}
答案 8 :(得分:0)
简单地,在AjaxOptions上,使用以下命令:
OnSuccess = "onSuccessFunction(data, 'Arg1');"
然后在您的函数中,您将获得新值:
function onSuccessFunction(result, myNewArg) {
//Prints Arg1
Console.Write(myNewArg)
}