Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC中的自定义参数处理程序_Asp.net Mvc_Routing - Fatal编程技术网

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推送到客户端即可获得相同的成功。