我是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)
如果从数据库中获取模型(如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.
您可以通过简单地从控制器抛出异常来实现。
您需要编写以下代码并需要添加 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)
| 归档时间: |
|
| 查看次数: |
43161 次 |
| 最近记录: |