我是MVC的新手,正在處理錯誤處理和異常。正如你可能會或可能不知道,通過視圖處理HTTP錯誤的實現是完全笨拙的,原因如下:ASP.NET MVC 5如何防止視圖顯示爲文本
1.)頁面狀態代碼設置爲200,這將導致錯誤頁面被索引一個搜索引擎,並讓用戶知道一切正常,這是不正確的。
2.)錯誤頁面的URL更改,我不想要。不幸的是,我無法將ResponseRewrite與View結合使用,因爲它使用了Server.Transfer,這意味着它會查找與View相對的文件。
我更喜歡使用View來處理所有應用程序異常和HTTP錯誤處理,因爲View通過在View啓動時調用_Layout.cshtml來維護站點佈局。因此,在過去一週內完成此工作之後,我想我找到了一個實現,它允許我在解決上述兩個問題的同時使用View(請參閱以下Web鏈接中的Starain Chen的解決方案1)。
我的問題是,對我來說,視圖正在所有文本中顯示。任何想法爲什麼會發生這種情況,更重要的是,如何強制網站被渲染而不是像文本一樣被拋棄?
https://forums.asp.net/t/1996026.aspx?How+to+keep+url+same+after+page+postback+with+error+in+MVC
我的代碼:
的web.config(截斷)
<system.web>
<customErrors mode="On" >
</customErrors>
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>
的Global.asax
namespace WebApplication1
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_Error()
{
if (Context.IsCustomErrorEnabled)
ShowError(Server.GetLastError());
}
private void ShowError(Exception exception)
{
var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception);
Response.Clear();
var routeData = new RouteData();
routeData.Values.Add("Controller", "Error");
routeData.Values.Add("fromAppErrorEvent", true);
routeData.Values.Add("ErrorMessage", httpException.Message);
routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
switch (httpException.GetHttpCode())
{
case 403:
routeData.Values.Add("action", "HttpError403");
break;
case 404:
routeData.Values.Add("action", "HttpError404");
break;
case 500:
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "GeneralError");
break;
}
Server.ClearError();
IController controller = new Controllers.ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
}
ErrorController
namespace WebApplication1.Controllers
{
public class ErrorController : Controller
{
// GET: Error
public ActionResult HttpError404()
{
ViewBag.errormessage = this.RouteData.Values["ErrorMessage"];
ViewBag.status = this.RouteData.Values["httpStatusCode"];
Response.StatusCode = Convert.ToInt32(this.RouteData.Values["httpStatusCode"]);
Response.TrySkipIisCustomErrors = true;
return View();
}
}
}
HttpError404.cshtml查看
@{
ViewBag.Title = "HttpError404";
}
@*<h2>HttpError404</h2>
ErrorMessge: @ViewBag.errormessage
<br />
Status: @ViewBag.status*@
不幸的是,這在MVC中並不像我本來那麼容易...... – mortb
例如,您可以閱讀有關404處理的內容:http://stackoverflow.com/questions/619895/how-can-i -properly-handle-404-in-asp-net-mvc – mortb
這是一個答案,我解釋瞭如何解決這個問題http://stackoverflow.com/a/38249656/5233410 – Nkosi