ASP.NET MVC中的自定义参数处理程序

时间:2011-02-05 19:05:08

标签: asp.net-mvc routing

我有这样的行动:

public JsonResult Action(String deviceId, Guid clientId)

所以,根据url(带参数)就像

www.site/ControllerName/Action?deviceId=123&clientId= {some_guid}

毫无疑问,如果无法将{some_guid}解析为 Guid 类型,asp.net将生成错误。 问题是在这种错误的格式化请求的情况下,我需要服务器返回特殊的 JSON 结果,并带有{“result”:“1”之类的消息; “评论”:“网址错误。请查看参数 clientId ”} 如何在执行前检查操作参数?

4 个答案:

答案 0 :(得分:3)

我会将您的签名更改为:

public ActionResult Action(String deviceId, string clientId)

然后你可以

Guid id;
if (!Guid.TryParse(clientId, out id))
{
   // take appropiate action
}

答案 1 :(得分:2)

我会保留你所拥有的但可以使参数可以为空;

public ActionResult Action(String deviceId, Guid? clientId)
{
     if (clientId.HasValue)
     {
         // Do something
     }
     else
     {
         throw new HttpException(404, "Url not found");
     }
 }

我意识到这几乎与上面相同,只有在这里你能够保持你的类型与原始帖子相同,只是检查是否已经传递了值

答案 2 :(得分:0)

您可能希望使用ModelBinder并在那里进行Guid.TryParse检查。如果某些内容有错误,您可以修改ModelState。

第二种方法是使用一些特殊的动作过滤器属性,例如与ASP.NET MVC捆绑在一起的HandleErrorAttribute。该过滤器可以捕获该特定类型的异常,并提供特定的错误处理工作流和结果替换(这里最好的想法可能只是重定向到404,因为“错误的Guid”只不过是“不存在的页面”)。

答案 3 :(得分:0)

我会做什么:

public ActionResult Action(int deviceId, string clientId)
{
    Guid clientGuid;

    if (!Guid.TryParse(clientId, out clientGuid))
    {
        throw new HttpException(404, "Action not found");
    }
    else
    {
        // Do some cool stuff....
    }
}