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

时间:2009-04-27 06:40:41

标签: asp.net-mvc

当我使用时:

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)?

9 个答案:

答案 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)
}