我可以在Ajax.ActionLink中使用OnSuccess事件传递参数

Who*_*mmy 36 asp.net-mvc

我用的时候:

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.


Kam*_*Kam 8

你可以这么做

剃刀:

... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')"
Run Code Online (Sandbox Code Playgroud)

请注意单引号!

JavaScript的:

function AnimateVoteMessage(YourParameter){
    alert(YourParameter);
}
Run Code Online (Sandbox Code Playgroud)

请享用,


Ale*_*x42 6

试试这个 - 它对我有用:

OnSuccess = "new Function('MyFunction(" + myParameter + ")')"
Run Code Online (Sandbox Code Playgroud)


sil*_*ter 0

我也遇到了这个问题...但没有找到解决方法!我做了一个解决方法(这不是很好,但现在解决了它......也许直到有人在这里发布解决方案)...我所做的是在 TargetId div 和 OnSuccess 中放置一个隐藏字段,我调用了一个 js 方法来检索隐藏字段中的值 <- 这可能发生在您的 AnimateVoteMessage 方法中...