Asp.net mvc 我可以通过Ajax.ActionLink中的OnSuccess事件传递参数吗
当我使用:Asp.net mvc 我可以通过Ajax.ActionLink中的OnSuccess事件传递参数吗,asp.net-mvc,Asp.net Mvc,当我使用: new AjaxOptions { UpdateTargetId = "VoteCount" + indx, OnSuccess = "AnimateVoteMessage" } new AjaxOptions { UpdateTargetId = "VoteCount" + indx, OnSuccess = "AnimateVoteMessage(2)" } 一切都很好…但我正试图用自动分配的ID来设置列表中项目的动画。因为我希望这些都可以从我的javasc
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage"
}
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage(2)"
}
一切都很好…但我正试图用自动分配的ID来设置列表中项目的动画。因为我希望这些都可以从我的javascript中寻址,所以我认为我需要向我的javascript传递一个参数。但当我使用:
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage"
}
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage(2)"
}
我得到一个“Sys.ArgumentUndefinedException:值不能未定义。”异常。我在使用MicrosoftMvcAjax.js的调试版本时就知道了。当使用压缩版本时,我得到一个“Microsoft JScript运行时错误:'b'为null或不是对象”
所以我的问题是,我是否可以使用OnSuccess
事件为ActionLink
向javascript函数传递一个参数
这是正确的方法吗?否则我怎么能让一个javascript函数能够在我的页面上的10个项目(在我的例子中是多个div的ID)上运行呢?我也在本期中运行过。。。没有找到解决的办法! 我做了一个变通办法(虽然不太好,但现在已经解决了…也许直到有人在这里发布解决方案为止)。。。 我所做的是在TargetId div中放置一个隐藏字段,在成功时我调用了一个js方法,该方法从隐藏字段中检索值使用以下方法:
OnSuccess = "function(){yourfunction(" + productcode + ");}"
或
试试这个-它对我有用:
OnSuccess = "new Function('MyFunction(" + myParameter + ")')"
或者…对我来说有点不同的语法:
OnSuccess = "( function() { MyFunction(arg1,arg2); } )"
看
基本上:
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
}
}
有一种更好的方法可以做到这一点——使用OnSuccess调用可以预期传递的内置参数 内置参数(我到目前为止找到的)是数据、状态和xhr data=从action方法返回的任何内容 status=如果成功,则此状态只是一个表示“成功”的字符串 xhr=指向一堆javascript内容的对象,我将不讨论这些内容 因此,您可以这样定义javascript(您可以省略不需要的参数-因为我们只需要从操作返回数据,我们只需要获取数据参数) 正如我之前所说,数据是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?" })
你会像这样设置你的动作链接
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?" })
这将创建一个确认消息框,询问您是否想要实际调用该操作-在提示符上单击yes将调用对控制器的调用-当调用返回时-data参数将包含一个JSON对象,该对象包含您在action方法中返回的任何内容。轻松点
但是等等!如果我想通过另一个自定义参数怎么办?!简单!只需将您的参数添加到列表的前面
而不是这个
function myOnSuccessFunction (data)
{
..do stuff here with the passed in data...
}
这样做(如果愿意,您可以有多个自定义参数,只需根据需要不断添加它们即可)
然后在您的设置中-只需通过ActionLink定义中的客户端脚本获取参数。。。i、 e
@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”可以来自您需要的任何地方-只需将此文本替换为您需要的文本即可
希望有帮助 你可以简单地做到这一点
剃刀:
... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')"
请注意单引号
JavaScript:
function AnimateVoteMessage(YourParameter){
alert(YourParameter);
}
享受吧,有一个更好的方法,我相信这是微软的意图:将AjaxOptions.OnSuccess设置为函数指针,即只设置函数名,不设置参数。MVC将自动发送其参数。下面是一个例子 JScript参数:
public class ObjectForJScript
{
List<int> Ids { get; set; }
}
查看代码:
@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);
}
publicJSONResult控制器动作(int测试)
{
var returnObject=new ObjectForJScript
{
Ids=新列表{test}
};
返回Json(returnObject);
}
请注意,JScript函数中的参数名并不重要,即使控制器将其命名为“returnObject”,您也不必将其命名为“returnObject”
还要注意,Json()可以方便地将列表转换为JScript数组。只要C#对象的方法可以翻译成Json,就可以像我所做的那样在JScript中调用它们
最后,控制器不必返回JsonResult,它可以是ActionResult(但通常最好让控制器操作只做一件事)
上面的示例将向两个对象(Json及其包含的数组对象)发出警报,然后向2发出警报。简单地说,在AjaxOptions中,使用以下命令:
OnSuccess = "onSuccessFunction(data, 'Arg1');"
然后在函数中,您将获得新值,如下所示:
function onSuccessFunction(result, myNewArg) {
//Prints Arg1
Console.Write(myNewArg)
}
你确定这样行吗?当我点击使用这种技术构建的链接时,我遇到了一个语法错误。我遇到了与“调试”和“非调试”版本中描述的完全相同的问题,出现了完全相同的错误-并尝试了您的方法,它对我非常有效。为什么vs的人不能告诉我们调用这样的函数,如果它对一个基本函数调用是如此的临时和挑剔呢?该死的白痴,已经浪费了我4个小时的时间了。但感谢堆富士和海报的问题解决了又一个毫无意义的vs错误!想想看,我正在使用vs2010 RTM!!!!拜托,你的建议对我很有效,因为我也有同样的问题。谢谢,太好了!谢谢你的提示。我怎样才能在成功的时候得到锚本身的参考呢?对于Microsoft.AspNet.Mvc,version=“5.2.2”,我需要在末尾加上()。像这样(function(){MyFunction(arg1,arg2);})()整个问题是关于如何将参数传递给MyFunction,而这个答案并没有解释arg1和arg2从何而来。。。目前还不清楚此纯文本参数是如何传递给MyFunction的。请注意,
OnSuccess
属性中函数调用中参数的顺序可以是任意顺序,您不需要将它们放在数据
参数之前。这是一个比Mike的答案更新且似乎更好的解决方案。此解决方案效果很好,因为它允许您传入数据、状态、xhr
以及您自己的自定义参数。刚刚测试过,效果很好。