我用的时候:
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage"
}
Run Code Online (Sandbox Code Playgroud)
一切正常......但我试图在列表中设置动画,并自动分配ID.由于我希望每个这些都可以通过我的javascript进行寻址,我相信我需要将参数传递给我的javascript.但是当我使用时:
new AjaxOptions
{
UpdateTargetId = "VoteCount" + indx,
OnSuccess = "AnimateVoteMessage(2)"
}
Run Code Online (Sandbox Code Playgroud)
我得到一个"Sys.ArgumentUndefinedException:值不能被定义." 例外.我在使用MicrosoftMvcAjax.js的调试版本时得到了.使用压缩版本时,我得到"Microsoft JScript运行时错误:'b'为null或不是对象"
所以我的问题是,我可以使用该OnSuccess事件将参数传递给我的javascript函数ActionLink吗?
这是正确的方法吗?我怎样才能拥有一个javascript函数能够在我的页面上运行10个项目(在我的情况下是多个DIV的ID)?
Mik*_*ike 29
或者...有点不同的语法对我有用:
OnSuccess = "( function() { MyFunction(arg1,arg2); } )"
Run Code Online (Sandbox Code Playgroud)
小智 29
有一种更好的方法 - 使用OnSuccess调用可以传递的内置参数
内置参数(我到目前为止找到的参数)是数据,状态和xhr
data =从action方法返回的任何内容
status =如果成功,此状态只是一个表示"成功"的字符串
xhr =指向一堆我不会讨论的javascript东西的对象...
所以你可以像这样定义你的javascript(你可以省略你不需要的参数 - 因为我们想要的只是我们的数据,我们将采取数据参数)
function myOnSuccessFunction (data)
{
..do stuff here with the passed in data...
}
Run Code Online (Sandbox Code Playgroud)
就像我之前说的那样,数据是ActionResult可能返回的任何JSON,所以如果你的控制器动作方法看起来像这样......
public ActionResult MyServerAction(Guid modelId)
{
MyModel mod = new MyModel(modelId);
mod.DoStuff();
return Json(mod, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
你会像这样设置你的行动链接......
@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?" })
Run Code Online (Sandbox Code Playgroud)
这将创建一个确认消息框,询问您是否要实际调用该操作 - 在提示符上单击是将调用对控制器的调用 - 当调用返回时 - data参数将包含您在其中返回的任何内容的JSON对象行动方法.十分简单!
可是等等!如果我想传递另一个自定义参数怎么办?!简单!只需将您的参数添加到列表的前面......
而不是这个......
function myOnSuccessFunction (data)
{
..do stuff here with the passed in data...
}
Run Code Online (Sandbox Code Playgroud)
这样做(如果你愿意,可以有多个自定义参数,只需根据需要添加它们)...
function myOnSuccessFunction (myCustomArg, data)
{
..do stuff here with the passed in data and custom args...
}
Run Code Online (Sandbox Code Playgroud)
然后在你的设置中 - 只需通过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?" })
Run Code Online (Sandbox Code Playgroud)
请注意,OnSuccess参数中的"myClientSideArg"可以来自您需要的任何位置 - 只需将此文本替换为您需要的内容即可.
希望有所帮助!
小智 9
有一种更好的方法,我相信是微软的意图:将AjaxOptions.OnSuccess设置为一个函数指针,即只是函数的名称,没有参数.MVC将自动发送参数.以下是一个例子.
JScript参数:
public class ObjectForJScript
{
List<int> Ids { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Jscript函数:
function onFormSuccess(foobar){
alert(foobar);
alert(foobar.Ids);
alert(foobar.Ids[0]);
}
Run Code Online (Sandbox Code Playgroud)
查看代码:
@using (Ajax.BeginForm("ControllerAction", "ControllerName",
new AjaxOptions
{
OnSuccess = "onFormSuccess" //see, just the name of our function
}))
{
@Html.Hidden("test", 2)
}
Run Code Online (Sandbox Code Playgroud)
控制器代码:
public JsonResult ControllerAction(int test)
{
var returnObject = new ObjectForJScript
{
Ids = new List<int>{test}
};
return Json(returnObject);
}
Run Code Online (Sandbox Code Playgroud)
请注意,JScript函数中的参数名称无关紧要,即使控制器对其进行了命名,也不必将其称为"returnObject".
另请注意,Json()可以方便地将List转换为JScript数组.只要C#对象的方法可以转换为Json,就可以像我一样在JScript中调用它们.
最后,控制器不必返回JsonResult,它可以是ActionResult(但通常最好让控制器操作做一件事).
上面的例子将警告两个对象(Json和它包含的数组对象),然后是2.
你可以这么做
剃刀:
... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')"
Run Code Online (Sandbox Code Playgroud)
请注意单引号!
JavaScript的:
function AnimateVoteMessage(YourParameter){
alert(YourParameter);
}
Run Code Online (Sandbox Code Playgroud)
请享用,
试试这个 - 它对我有用:
OnSuccess = "new Function('MyFunction(" + myParameter + ")')"
Run Code Online (Sandbox Code Playgroud)
我也遇到了这个问题...但没有找到解决方法!我做了一个解决方法(这不是很好,但现在解决了它......也许直到有人在这里发布解决方案)...我所做的是在 TargetId div 和 OnSuccess 中放置一个隐藏字段,我调用了一个 js 方法来检索隐藏字段中的值 <- 这可能发生在您的 AnimateVoteMessage 方法中...
| 归档时间: |
|
| 查看次数: |
36647 次 |
| 最近记录: |