ASP.NET MVC 5如何防止View显示为文本

时间:2017-02-16 10:21:25

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我是MVC的新手,正在处理错误处理和异常。正如您可能知道或不知道的那样,通过视图处理HTTP错误的实现完全是笨重的,原因如下:

1。)页面状态代码设置为200,这将导致错误页面被搜索引擎索引并让用户知道一切正常,这是不正确的。

2。)错误页面的URL发生了变化,我不想这样做。不幸的是,我不能将ResponseRewrite与View一起使用,因为它在引擎盖下使用Server.Transfer,这意味着它会查找文件而不是View。

我更喜欢使用View for all应用程序异常和HTTP错误处理,因为View通过在View启动中调用_Layout.cshtml来维护站点布局。因此,在过去一周处理完这个问题之后,我想我找到了一个实现,允许我在解决上面提到的两个问题时使用View(请参阅下面的Weblink中的Starain Chen的解决方案1)。

我的问题是这个,对我来说,View正在所有文本中显示。任何想法为什么会发生这种情况,更重要的是,如何强制网站呈现而不是被抛弃为文本?

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*@

1 个答案:

答案 0 :(得分:0)

问题是由Visual Studio 2013中的项目打开引起的,奇怪的是。关闭项目,View在Firefox甚至Chrome中正确呈现。在VS2013中打开项目,Chrome和Firebox都返回显示视图的文本。当VS2013项目打开时,IE必须具有一些代码感知来呈现项目。奇异。