2014-11-04 2 views
0

У меня есть частичное, что я обновляю через Ajax.ASP.NET MVC: Перенаправление ошибок с частичным на главный вид

Просмотр Javascript:

$("#SelectedId").change(function() { 
    var id = $("#SelectedId").val(); 
    if (id > 0) { 
    $.ajax({ 
     url: "/Home/Refresh", 
     data: { id: id }, 
     type: "POST", 
     success: function (result) { 
     $('#partialHolder').html(result); 
     } 
    }); 
    } 
}); 

Refresh действие:

[HttpPost] 
public ActionResult Refresh(int id) 
{ 
    HomeViewModel model = new HomeViewModel(); 
    model.id = id; 

    ViewBag.id = model.id; 
    PrepareModel(ref model); 
    return PartialView("~/Views/PartialView.cshtml", model); 
} 

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

действие Ошибка:

public ActionResult Error(string message) 
{ 
    ViewBag.Message = message; 
    return View(); 
} 

Я попытался с помощью Javascript (как в представлении и возвращенная контроллером) для перенаправления браузера, однако оба глючит и я предполагаю, что плохая практика.

+1

Можете ли вы показать код обновления действия? – theLaw

+0

См. Http://stackoverflow.com/questions/2261617/how-to-handle-model-state-errors-in-ajax-invoked-controller-action-that-returns – ScottE

ответ

0

мне удалось решить эту проблему в аналогично способу theLaw's answer, используя try/catch и вспомогательный метод Content, чтобы вернуть простую строку, которая вызывает перенаправление.

Обновить Действие:

[HttpPost] 
public ActionResult Refresh(int id) 
{ 
    try 
    { 
     HomeViewModel model = new HomeViewModel(); 
     model.id = id; 

     ViewBag.id = model.id; 
     PrepareModel(ref model); 
     return PartialView("~/Views/PartialView.cshtml", model); 
    } 
    catch 
    { 
     return Content("error"); 
    } 
} 

Посмотреть Javascript:

$("#SelectedId").change(function() { 
    var id = $("#SelectedId").val(); 
    if (id > 0) { 
    $.ajax({ 
     url: "/Home/Refresh", 
     data: { id: id }, 
     type: "POST", 
     success: function (result) { 
     if (result == "error") { 
      location.replace("@Url.Action("General", "Error")"); 
     } 
     else { 
      ('#partialHolder').html(result); 
     } 
     } 
    }); 
    } 
}); 
0

Try, как

$("#SelectedId").change(function() { 
    var id = $("#SelectedId").val(); 
    if (id > 0) { 
    $.ajax({ 
     url: "/Home/Refresh", 
     data: { id: id }, 
     type: "POST", 
     success: function (result) { 
     $('#partialHolder').html(result); 
     }, 
     error: function(result){ 
     //call new action 
     } 
    }); 
    } 
}); 
+0

Исключение, о котором идет речь, похоже не влияют на возврат частичного, только некоторые из данных внутри него, поэтому блок ошибок никогда не запускается. –

0

Предполагая Error() возвращает полный вид (с планировкой и сценария/CSS), вы всегда можете попробовать полностью переписав документ:

success: function (result) { 
    $('#partialHolder').html(result); 
}, 
error: function(xhr) { 
    if(xhr.responseText) { 
     var newDoc = document.open("text/html", "replace"); 
     newDoc.write(xhr.responseText); 
     newDoc.close(); 
    } 
} 

Это позволит эффективно перезаписать цельные dom и будет заставлять вас потерять все, что было на странице.

Кредиты для документов переписывают в this answer

+0

Как и с Amit - по какой-то причине блок ошибок не запускается, даже когда генерируется исключение. –

+0

@OliWalker Что возвращается с вашего сервера? Какой код статуса http он возвращает? – Kippie

+0

Возвращается частичный вид, но вызов внутри него не преуспевает и вызывает ошибку. Это будет исправлено в ближайшее время, но я хочу убедиться, что будущие ошибки отображаются в главном представлении. –

0

Попробуйте что-то вроде этого

в своем действии

[HttpPost] 
public ActionResult Refresh(int id) 
{ 
    try 
    { 
     HomeViewModel model = new HomeViewModel(); 
     model.id = id; 

     ViewBag.id = model.id; 
     PrepareModel(ref model); 
     return PartialView("~/Views/PartialView.cshtml", model); 
    } 
    catch 
    { 
     return PartialView("~/Views/PartialView.cshtml", null); 
    } 
} 

так в вашем АЯКС успеха

if (result != null) { 
    //do your stuff 
} else { 
    // the controller action returned a partial 
    $('#divInYourMain').html("Error 123"); 
} 
+0

К сожалению, это тоже не сработает. Я не вижу, как возвращение частичного с нулевой моделью сделает 'result == null' true? –

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