Asp.net mvc ASP.NET MVC中的自定义参数处理程序
我有这样一个动作:Asp.net mvc ASP.NET MVC中的自定义参数处理程序,asp.net-mvc,routing,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
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;comments:error url。请查看参数clientId}。
如何在执行之前检查操作参数?我会将您的签名更改为:
public ActionResult Action(String deviceId, string clientId)
那你可以
Guid id;
if (!Guid.TryParse(clientId, out id))
{
// take appropiate action
}
我想把你的签名改为:
public ActionResult Action(String deviceId, string clientId)
那你可以
Guid id;
if (!Guid.TryParse(clientId, out id))
{
// take appropiate action
}
您可能需要使用ModelBinder,并在那里进行Guid.TryParse检查。如果有错误的值,可以修改ModelState
第二种方法是使用一些特殊的操作过滤器属性,如与ASP.NET MVC捆绑的HandleErrorAttribute。该过滤器可以捕获特定类型的异常,并提供特定的错误处理工作流和结果替换。这里最好的方法可能是重定向到404,因为错误的Guid只不过是不存在的页面。您可能希望使用ModelBinder进行此操作,并在那里进行Guid.TryParse检查。如果有错误的值,可以修改ModelState 第二种方法是使用一些特殊的操作过滤器属性,如与ASP.NET MVC捆绑的HandleErrorAttribute。该过滤器可以捕获特定类型的异常,并提供特定的错误处理工作流和结果替换。这里最好的方法可能是重定向到404,因为错误的Guid只不过是不存在的页面。我会做什么:
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....
}
}
我要做的是:
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....
}
}
我会保留你所拥有的,但要使参数为空
public ActionResult Action(String deviceId, Guid? clientId)
{
if (clientId.HasValue)
{
// Do something
}
else
{
throw new HttpException(404, "Url not found");
}
}
我意识到这几乎和上面一样,只是在这里你可以保持你的类型和你原来的帖子一样,只是检查是否传递了值我会保留你所拥有的,但参数可以为空
public ActionResult Action(String deviceId, Guid? clientId)
{
if (clientId.HasValue)
{
// Do something
}
else
{
throw new HttpException(404, "Url not found");
}
}
我意识到这与上面的几乎相同,只是在这里你可以保持你的类型与原始帖子相同,只是检查是否传递了值为什么在get请求时使用ModelState.AddModelError?-此外,在这种情况下抛出自定义错误也没有意义。如果用户试图访问一个不存在的URL,则返回代码为404的httpexception。@ebb。问题是这个动作的结果是json对象。如果url格式错误,我需要返回{result:1;comments:Error clienId}。是的,这是可能的解决方案之一,但我想知道MVC是否提供了其他方法。@ebb,确实AddModelError不太适合这里。我把它拿走了。Thx!:-当它是get请求时,为什么使用ModelState.AddModelError此外,在这种情况下抛出自定义错误也没有意义。如果用户试图访问一个不存在的URL,则返回代码为404的httpexception。@ebb。问题是这个动作的结果是json对象。如果url格式错误,我需要返回{result:1;comments:Error clienId}。是的,这是可能的解决方案之一,但我想知道MVC是否提供了其他方法。@ebb,确实AddModelError不太适合这里。我把它拿走了。Thx!:-参数deviceId是只允许数字还是也允许字符?这是简单的字符串类型。在本例中,它包含字母、数字和“-”符号。如果没有更多信息,就不可能提供正确的答案。您在评论中写道,您正试图返回一个JSON对象,您是否隐藏了更多的细节?@ebb,没关系。我只是想知道自己如何处理动作参数解析。但几乎每个人都建议我将用户重定向到404页面。这不是我需要的东西。那么请告诉我们你需要什么,而不是说“不”,这还不够好。参数deviceId是否意味着只允许数字或字符?这是简单的字符串类型。在本例中,它包含字母、数字和“-”符号。如果没有更多信息,就不可能提供正确的答案。您在评论中写道,您正试图返回一个JSON对象,您是否隐藏了更多的细节?@ebb,没关系。我只是想知道自己如何处理动作参数解析。但几乎每个人都建议我将用户重定向到404页面。这不是我需要的东西。那么请告诉我们你需要什么,而不是说不,不够好。我不需要将用户重定向到另一个页面。有必要提醒用户操作结果中的参数格式错误。问题是这个动作的结果是json对象。如果url格式错误,我需要返回{result:1;comments:error clienId}。@JooLio,实际上我不是指重定向。我的意思是只使用404状态代码和合适的页面。但你刚才告诉我了
关于完全不同的故事-JSON。请在原始帖子中提到这个细节。另外,你最好重新阅读我的答案。我提出404只是作为定制工作流处理的一个可能场景。您只需将任何预定义的JSON推送到客户端即可获得同样的成功。我不需要将用户重定向到其他页面。有必要提醒用户操作结果中的参数格式错误。问题是这个动作的结果是json对象。如果url格式错误,我需要返回{result:1;comments:error clienId}。@JooLio,实际上我不是指重定向。我的意思是只使用404状态代码和合适的页面。但你刚才告诉我完全不同的故事——JSON。请在原始帖子中提到这个细节。另外,你最好重新阅读我的答案。我提出404只是作为定制工作流处理的一个可能场景。您只需将任何预定义的JSON推送到客户端即可获得相同的成功。