控制器返回错误消息而不是视图?

Jon*_*ood 9 asp.net-mvc

我是ASP.NET MVC的新手,我不确定如何最好地处理以下情况.

我的控制器中的方法需要根据ID参数加载一些数据.在正常情况下,此ID参数将设置为数据库中实体的有效ID.我构造了一些数据并将其放在ViewBag中,视图用它来呈现页面.

不过,我想一些基本的错误处理,以防万一ID的说法是不是有效.虽然我可以在视图中编写一堆错误处理代码,但如果网站出现重大误用或故障,则不显示视图会更简单.

有没有办法控制器可以简单地返回"找不到项目"字符串或类似的东西,并显示该而不是正常视图?或者也许有人可以提出更好的主意?

Chr*_*tow 28

if (itemId == null)
{
    return Content("Item not found");
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要返回HTTP 404:

throw new HttpException(404, "Item Not Found");
Run Code Online (Sandbox Code Playgroud)

  • 我现在已经忘记了几次并且很难找到正确的答案,但对于未来的googlers,这种方式更好:`return new HttpStatusCodeResult(404,"Item Not Found");`.它不会抛出异常,显然不仅限于404错误. (10认同)
  • 同样对于未来的googlers:netcore似乎没有HttpStatusCodeResult(至少我能找到8/2017).因此,另一种方法是更改​​对相应代码的响应,然后返回具有指定路径的视图到错误视图.因此对于例如404:`Response.StatusCode = 404;`和`返回View("NotFound","Item Not Found")`.其中"NotFound"是Views目录中的404错误视图. (2认同)

arc*_*hil 7

如果从数据库中获取模型(如Darin的答案中所述)在某种程度上是复杂的并且不能通用,那么我就是如何处理未找到的资源.

实现您的基本控制器

    public abstract class MyBaseController : Controller
    {
        [NonAction]
        protected virtual void EnsureResourceFound(object resource)
        {
            if (resource == null)
            {
                HttpStatusCode statusCode = HttpStatusCode.NotFound;
                throw new HttpException((int)statusCode, statusCode.ToString());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在派生控制器中 - 使用该方法

    [HttpGet]
    public virtual ActionResult Edit(int id)
    {
        SomeModel model = null;
        EnsureResourceFound(model = _someModelService.Get(id));
        return View(question);
    }
Run Code Online (Sandbox Code Playgroud)

您将如何处理生成的http异常,返回自定义视图,记录错误,取决于配置HandleErrorAttribute.


alo*_*ida 5

您可以通过简单地从控制器抛出异常来实现。

您需要编写以下代码并需要添加 ErrorController 及其各自的视图。

全球.asax

Exception exception = Server.GetLastError();

Response.Clear();

HttpException httpException = exception as HttpException;

//Add controller name
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");

//we will add controller's action name 
routeData.Values.Add("action", "Index");

// Pass exception details to the target error View.
routeData.Values.Add("error", exception.Message);

// Clear the error on server.
Server.ClearError();

// Call target Controller and pass the routeData.
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));


//and throw the exception from the Controller ny simply writing
throw new Exception()
Run Code Online (Sandbox Code Playgroud)

错误控制器:

public class ErrorController : BaseController
    {
        #region Function Declaration
        /// <summary>
        /// Shows application error
        /// </summary>
        /// <param name="error">error description</param>
        public ActionResult Index(string error)
        {
            ViewBag.Description = Resources.ErrorMessage.GeneralError;
            if (string.IsNullOrEmpty(error))
            {
                ViewBag.DetailError = error;
            }
            else
            {
                ViewBag.DetailError = string.Empty;
            }

            return View("ErrorIndex");
        }
        #endregion
    }
Run Code Online (Sandbox Code Playgroud)

另一种方法:

如果您想为特定错误编写视图,则必须编写以下代码。您只需添加 DivByZero 视图。

    [HandleError(View = "DivByZero", ExceptionType = typeof(System.DivideByZeroException))]
    public ActionResult About()
    {
        List<Alok> alokList = new List<Alok>();
        var al = from aa in alokList.Distinct()
                 select aa;

        ViewData["Errorname"] = "Divide By Zero Exception";
        ViewBag.ErrorName = "Divide By Zero Exception";
        //throw new DivideByZeroException();

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

DivByZero 视图:

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "Error";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@*<h2>
    @ViewData["Errorname"].ToString()
    @ViewBag.ErrorName</h2>*@
<p>
    Controller : @Model.ControllerName
</p>
<p>
    Action : @Model.ActionName
</p>
<p>
    Error Message : @Model.Exception
</p>
Run Code Online (Sandbox Code Playgroud)