2014-12-09 3 views
1

Я хочу вернуть результат JSON. Для этого у меня есть метод контроллера следующим образом, что вызывается из Ajax.BeginForm на Вид:Возврат JSONResult без переключения просмотров

@using (Ajax.BeginForm("Update", new AjaxOptions { OnSuccess = "MySuccessMethod()" })) 
{ 
    <!-- some form stuff --> 
    <input type="submit" value="Submit"/> 
} 

Это контроллер, который обрабатывает его:

[HttpPost] 
public JsonResult Update(FormCollection fc) 
{ 
    // Process form stuff 
    return Json (new {success = true }); 
} 

То, что я хочу, чтобы обработать успех ответ с MySuccessMethod. То, что я вижу в том, что взгляд на представить идет к правильному методу контроллера выше, который затем перенаправляет страницу в URL /Home/Update со следующей строкой на экране:

{ «Успех»: истинный}

Не уверен, что это актуально, но я использую Mono.

Как я могу сделать фреймворк не переключать страницы на /Home/Update или не отображать строку JSON в представлении и просто обрабатывать JSON в задней части?

ответ

3

Для вашего первого вопроса, то проверьте следующее:

1) Убедитесь, что у вас есть Microsoft.jQuery.Unobtrusive.Ajax включены и ссылки

2) OnSuccess = "MySuccessMethod()" должен быть OnSuccess = "MySuccessMethod" (где MySuccessMethod является JavaScript метод, а не C# один)

Для вашего второго вопроса вы можете вернуть свой метод ActionResult вместо JsonResult (см. here для получения дополнительной информации). JsonResult является тип ActionResult, что означает, что обновление ваших действий для возврата ActionResult позволит ваш метод вернуть несколько типов ActionResult в зависимости от сценария:

[HttpPost] 
public ActionResult SomeThing(int randomParam) 
{ 
    if (randomParam == 0) 
    { 
     return Json("Zero!"); 
    } 
    else if (randomParam == 1) 
    { 
     return View("Not zero!"); 
    } 
    else 
    { 
     return HttpNotFound("Error: I can only find zeroes and ones"); 
    } 
} 

Как общее правило (хотя иногда и правила предназначены (например, ваш пример, JsonResult вместо ActionResult) делает ваше действие менее подверженным ошибкам, так как, например, Visual Studio сообщит вам, если вы случайно попытаетесь вернуть другой тип результата - используйте ActionResult, когда ваше действие возвращает более одного типа результата.

+0

Спасибо. Можно ли разместить точку зрения на контроллер с помощью формы ajax? –

+1

Абсолютно. Вам просто нужно убедиться, что объект, который вы передаете контроллеру через форму, соответствует вашей модели просмотра. Пример можно найти здесь (http://stackoverflow.com/questions/9871365/mvc3-passing-viewmodel-to-controller-method-using-jquery-ajax). – trashr0x

+0

Да, спасибо! Поскольку в viewmodel есть два объекта с большим количеством свойств, я решил использовать только первичный ключ и одно значение, которое я обновляю. Затем я просматриваю форму и обновляю базу данных. Это хорошее решение или есть лучший способ? –

Смежные вопросы