我在web.config
中进行了以下设置<customErrors mode="RemoteOnly" defaultRedirect="/ServerError" redirectMode="ResponseRewrite"/>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="400" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="400" path="/error/Error400" responseMode="ExecuteURL" />
<error statusCode="404" path="/error/Error404" responseMode="ExecuteURL" />
<error statusCode="500" path="/error/Error500" responseMode="ExecuteURL" />
</httpErrors>
通过上述配置,我们的网站能够捕获404,并显示从/ error / error404提供的404页面与404标题。
现在我有以下情况:
1.用户导航到/ action / id
2.找不到ID,我想返回404,但是提供自定义404,不同于/ error / error404提供的通用404。即提供不同的自定义页面;
在我的控制器中,我有以下内容:
Response.StatusCode=(int)HttpStatusCode.NotFound;
Response.TrySkipIisCustomErrors = true;
return View("SomeView", model);
这是可以实现的吗?
PS:使用IIS 8
LE 如果有人对我实施的解决方案感兴趣,我已完成以下工作:
1.在我的action
中,我设置了一个会话变量Session["InvalidId"]=something
2.在我ErrorController
我有以下内容:
var invalidId = Session["InvalidId"];
if(invalidId != null)
{
return View("SomeView", model);
}
这有助于我为我的通用页面提供不同的404页面。
感谢您的帮助!
答案 0 :(得分:1)
是的,这很容易实现,而且你真的不需要其他页面。您需要为自定义消息提供一些会话变量,并使用它们来确定是否需要显示某些消息。如果是,请在您的视图中显示它们。
算法:
答案 1 :(得分:1)
根据您处理异常的方式,您可以创建自己的继承自HttpException
的异常类。
[Serializable]
public class MyHttpException : HttpException
{
// Constructors ...
// You could either allow for an http status code to be passed in a
// constructor (to make your class more reusable) or you could call the
// base constructor with 404
// Additional properties if needed ...
}
然后,在你的行动中,当你的条件得到满足时(即没有找到id),你可以抛出一个新的MyHttpException
。
您的异常处理机制可以测试当前异常是否为MyHttpException
并对自定义视图做出反应。它也应该像你一样设置正确的响应状态代码。
状态代码可以来自MyHttpException
,因为它是HttpException
:
(HttpStatusCode)myHttpException.GetHttpCode()
我不确定您拥有哪些控制器或如何捕获应用程序范围的异常,但我所拥有的是一个带有索引操作的ErrorController,其中Exception
作为参数:
public ActionResult Index(Exception exception) { ... }
正是这个动作决定了基于异常对象返回的内容,类似于我上面描述的内容。
希望这有帮助。
P.S。我的web.config中有类似的<httpErrors>...</httpErrors>
设置,我的自定义异常与404状态代码一起使用,如上所述。