Могу ли я передать параметр с событием OnSuccess в Ajax.ActionLink - PullRequest
36 голосов
/ 27 апреля 2009

Когда я использую:

new AjaxOptions
{
  UpdateTargetId = "VoteCount" + indx,
  OnSuccess = "AnimateVoteMessage"
}

все работает нормально ... но я пытаюсь анимировать элементы в списке с автоматически назначенными идентификаторами. Поскольку я хочу, чтобы каждый из них был адресуемым из моего javascript, я считаю, что мне нужно передать параметр в мой javascript. Но когда я использую:

new AjaxOptions
{ 
  UpdateTargetId = "VoteCount" + indx,
  OnSuccess = "AnimateVoteMessage(2)"
}

Я получаю «Sys.ArgumentUndefinedException: значение не может быть неопределенным». исключение. Ну, я получаю это при использовании отладочных версий MicrosoftMvcAjax.js. При использовании сжатой версии я получаю «Ошибка времени выполнения Microsoft JScript:« b »является нулем или не является объектом»

Итак, мой вопрос, могу ли я передать параметр в свою функцию javascript, используя событие OnSuccess для ActionLink?

Это правильный подход? Как еще я хочу, чтобы одна функция javascript могла запускаться на 10 элементах (в моем случае идентификаторы нескольких DIV) на моей странице?

Ответы [ 8 ]

29 голосов
/ 02 марта 2012

Есть лучший способ сделать это - использовать встроенные параметры, которые можно ожидать от вызова OnSuccess

встроенные параметры (те, которые я до сих пор нашел) - это данные, статус и xhr

данные = все, что вы возвращаете из метода действия

status = в случае успеха этот статус - просто строка с надписью «success»

xhr = объект, который указывает на кучу javascript вещей, которые я не буду обсуждать ...

чтобы вы могли определить свой javascript следующим образом (вы можете опустить ненужные аргументы - поскольку все, что нам нужно, - это вернуть данные из действия, мы просто возьмем аргумент data)

function myOnSuccessFunction (data)
{
   ..do stuff here with the passed in data...
}

Как я уже говорил, данные - это любой JSON, который может быть возвращен ActionResult, поэтому, если ваш метод действия контроллера выглядит следующим образом ...

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

это создаст окно с сообщением о подтверждении, спрашивающее, хотите ли вы на самом деле вызвать действие - нажатие кнопки «Да» в приглашении вызовет вызов к контроллеру - когда вызов возвращается - аргумент данных будет содержать объект JSON независимо от того, вернулся в ваш метод действия. Easy Peasy!

Но подождите! Что делать, если я хочу передать другой пользовательский аргумент ?! Просто! Просто добавьте свои аргументы в начало списка ...

вместо этого ...

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

Обратите внимание, что «myClientSideArg» в параметре OnSuccess может приходить откуда угодно, просто замените этот текст на то, что вам нужно.

Надежда, которая помогает!

29 голосов
/ 08 июля 2009

или ... немного другой синтаксис, который работал для меня:

OnSuccess = "( function() { MyFunction(arg1,arg2); } )"
9 голосов
/ 14 августа 2013

Существует лучший способ, который, как я полагаю, предназначен для этого Microsoft: установите 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 () удобно превращает наш список в массив JScript. Пока методы объекта C # могут быть переведены в Json, вы можете вызывать их в JScript, как я это сделал.

Наконец, контроллеру не нужно возвращать JsonResult, это может быть ActionResult (но обычно лучше, чтобы действие контроллера выполняло только одно).

Приведенный выше пример предупредит два объекта (Json и объект массива, который он содержит), а затем 2.

8 голосов
/ 08 мая 2013

Вы можете просто сделать это

Razor:

... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')"

Обратите внимание на одинарные кавычки!

JavaScript:

function AnimateVoteMessage(YourParameter){
    alert(YourParameter);
}

Наслаждайтесь,

6 голосов
/ 25 июня 2009

Попробуйте это - у меня это работает:

OnSuccess = "new Function('MyFunction(" + myParameter + ")')"
3 голосов
/ 28 апреля 2009

Используйте это:

OnSuccess = "function(){yourfunction(" + productcode + ");}"

или

OnSuccess = "function(){yourfunction(this, " + productcode + ");}"
0 голосов
/ 01 августа 2010

См. 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
        }        
    }
0 голосов
/ 28 апреля 2009

Я тоже столкнулся с этой проблемой ... и не нашел способа ее решить! Я сделал обходной путь (который не является хорошим, но решил это пока ... возможно, пока кто-то не отправляет решение здесь) ... я поместил скрытое поле в div TargetId и OnSuccess, который я назвал методом js, который извлекает значение из скрытого поля <- это может произойти в вашем методе AnimateVoteMessage ... </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...