Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 我可以通过Ajax.ActionLink中的OnSuccess事件传递参数吗_Asp.net Mvc - Fatal编程技术网

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
以及您自己的自定义参数。刚刚测试过,效果很好。