【问题标题】:Custom parameters handler in ASP.NET MVCASP.NET MVC 中的自定义参数处理程序
【发布时间】:2011-02-05 19:05:07
【问题描述】:

我有这样的动作:

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"; 这样的消息。 "cmets":"url 错误。检查参数 clientId" }.
如何在执行前检查动作参数?

【问题讨论】:

  • 参数“deviceId”是指只允许数字还是字符?
  • 这是简单的字符串类型。在这种情况下,它包含字母、数字和“-”符号。
  • 如果没有更多信息,真的不可能提供正确的答案。您在评论中写了一个您试图返回 JSON 对象的答案 - 您是否隐藏了更多细节?
  • @ebb,没关系。我只想知道如何自己处理动作参数解析。但几乎每个人都建议我将用户重定向到 404 页面。这不是我需要的东西。
  • 那么请告诉我们你需要什么,而不是说“不,不够好”。

标签: asp.net-mvc routing


【解决方案1】:

我会将您的签名更改为:

public ActionResult Action(String deviceId, string clientId)

那么你就可以了

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

【讨论】:

  • 为什么在获取请求时使用 ModelState.AddModelError()? - 此外,在这种情况下抛出自定义错误是没有意义的。如果用户尝试访问不存在的 URL,则返回带有代码 404 的 httpexception。
  • @ebb。问题是这个动作的结果是 json 对象。我需要返回 {"result":"1"; "cmets":"wrong clienId" } 以防 url 格式错误。
  • 是的,这是可能的解决方案之一,但我想知道 MVC 是否提供了其他方法。
  • @ebb,确实 AddModelError 不太适合那里。我已将其删除。谢谢! :-)
【解决方案2】:

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

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

我意识到这与上面几乎相同,只是在这里您可以保持您的类型与原始帖子相同,只是检查是否已传递值

【讨论】:

    【解决方案3】:

    您可能希望为此使用 ModelBinder 并在此处检查 Guid.TryParse。如果某处有错误的值,您可以修改 ModelState。

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

    【讨论】:

    • 我不需要将用户重定向到另一个页面。有必要在动作结果中提醒用户错误的参数格式。问题是这个动作的结果是 json 对象。我需要返回 {"result":"1"; "cmets":"wrong clienId" } 以防 url 格式错误。
    • @JooLio,其实我不是指重定向。我的意思是只为这样的页面使用 404 状态代码和适当的页面。但你刚刚告诉我一个完全不同的故事——JSON。请在原帖中提及该细节。
    • 另外,你最好重新阅读我的回答。我提出了 404 作为“自定义工作流处理”的可能场景。您可以将任何预定义的 JSON 推送到客户端,同样成功。
    【解决方案4】:

    我会做什么:

    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....
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 2010-12-24
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多