浏览此主题的 100 个链接后,我找不到解决问题的方法。我正在手动处理 404 自定义错误页面,如下所示
当我在地址栏中输入任何错误的 url 并正确显示 404 错误页面时,我的以下解决方案有效。但是当我输入http://localhost:57101/p/any
或http://localhost:57101/p/123
显示网页不可用时。对于第一个参数 id 的错误不能包含空条目。第二个是产品ID,它被删除所以产品为空,所以我在那里抛出手动异常。
我的 web.config 设置是
<customErrors mode="On" redirectMode="ResponseRedirect">
</customErrors>
我处理 404 错误的代码
protected void Application_Error(Object sender, EventArgs e)
{
//LogException(Server.GetLastError());
try
{
var exception = Server.GetLastError();
LogException(exception);
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "Http403";
break;
case 404:
routeData.Values["action"] = "Http404";
break;
}
}
else
{
Response.StatusCode = 404;
routeData.Values["action"] = "Http404";
}
IController errorsController = new Nop.Web.Controllers.ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch { }
#endregion
//log error
}
当我尝试浏览任何不存在的路线时,上面的代码有效。但是当我抛出异常如下
我的错误控制器是
public class ErrorsController : Controller
{
//
// GET: /Errors/
public ActionResult General(Exception exception)
{
Response.ContentType = "text/html";
Response.TrySkipIisCustomErrors = true;
return View();
}
public ActionResult Http404()
{
//return Content("Not found", "text/plain");
Response.ContentType = "text/html";
Response.TrySkipIisCustomErrors = true;
return View();
}
public ActionResult Http403()
{
Response.ContentType = "text/html";
Response.TrySkipIisCustomErrors = true;
return View();
}
}
public ActionResult Product(int productId)
{
var product = _productService.GetProductById(productId);
if(product==null)
throw new HttpException(404, "Product does not exists");
}
它显示“此网页不可用”。
我也想保留 url,就像它一样stackoverflow
。
有关此的任何帮助。