Подтвердить что ты не робот

Могу ли я передать параметр с событием OnSuccess в Ajax.ActionLink

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

OnSuccess = "( function() { MyFunction(arg1,arg2); } )"

Ответ 2

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

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

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

status = в случае успеха этот статус - это просто строка, в которой говорится "успех"

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

чтобы вы определили свой JavaScript как это (вы можете оставить аргументы, которые вам не нужны, поскольку все, что мы хотим, это наши данные из действия, которое мы просто возьмем аргумент данных)

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...
}

то в вашей настройке - просто получите аргумент через некоторую клиентскую сторону script в вашем определении 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?" })

Обратите внимание, что "myClientSideArg" в параметре OnSuccess может поступать из любого места, где вам нужно, - просто замените этот текст тем, что вам нужно.

Надеюсь, что это поможет!

Ответ 3

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

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

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

Ответ 4

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

Бритва:

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

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

JavaScript:

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

Enjoy,

Ответ 5

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

OnSuccess = "new Function('MyFunction(" + myParameter + ")')"

Ответ 6

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

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

или

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

Ответ 7

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

Ответ 8

См. 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
        }        
    }