ASP.NET MVC:正在将部分视图中的错误重定向为主视图

本文关键字:视图 错误 重定向 主视图 MVC NET ASP | 更新日期: 2023-09-27 18:29:15

我有一个通过Ajax刷新的部分。

查看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);
      }
    });
  }
});

刷新操作:

[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(在视图中和控制器返回)重定向浏览器,但两者都有缺陷,我认为这是一种糟糕的做法。

ASP.NET MVC:正在将部分视图中的错误重定向为主视图

尝试作为

$("#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
      }
    });
  }
});

假设Error()返回一个完整的视图(带有布局和script/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,导致您丢失页面上的所有内容。

文档重写到此答案的学分

试试这样的

在你的行动

[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);
   }
}

所以在您的ajax成功

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

我设法以类似于Law答案的方式解决了这个问题,通过使用try/catch块和Content helper方法返回一个触发重定向的简单字符串。

刷新操作:

[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);
        }
      }
    });
  }
});