避免ASP.NET MVC路由错误的优雅方式

时间:2012-07-03 19:29:04

标签: asp.net asp.net-mvc

我有一条路线:

        routes.MapRoute("ResetPasswordConfirm", "reset-password-confirm", new { controller = "Membership", action = "ResetPasswordConfirm" });

和代码

    public ActionResult ResetPasswordConfirm(int userid, string key)
    {
        // ...
    }

在我的申请中。所以我有这样的url执行:

http://localhost/reset-password-confirm?userid=1&key=bla_bla_something

这绝对没问题,直到有人决定去

http://localhost/reset-password-confirm

......看看会发生什么。 ASP.NET将生成可预测的错误:

  

参数字典包含非可空类型'System.Int32'参数'userid'的空条目...

也可以通过搜索机器人试图抓住所有可能的网址来完成。没关系,但在野外使用应用程序时会产生很多错误。我想避免这种情况,但是为这种错误编写针对每种可能情况的存根感到不舒服。

有没有优雅的方式呢?感谢。

2 个答案:

答案 0 :(得分:2)

另一种方法是处理全局错误,只需在<customErrors mode="On"></customErrors>上设置web.config,然后在Error.cshtml视图文件夹中创建Shared。 MVC3模板实际上包含该页面。

另一方面,如果你想更具体一点,你应该尝试Action Filters,这是处理错误的一种很酷的方法。

[HandleError(View = "YourErrorView", ExceptionType=typeof(NullReferenceException))]
public ActionResult ResetPasswordConfirm(int? userid, string key)
{
      if (!userid.HasValue)
         throw new NullReferenceException();
      // ...
}

答案 1 :(得分:1)

将nullables用于您的参数,即:

public ActionResult ResetPasswordConfirm( int? userid,string key)