Asp.net mvc asp.net mvc-字符串或int的路由(即/type/23或/type/hats)

Asp.net mvc asp.net mvc-字符串或int的路由(即/type/23或/type/hats),asp.net-mvc,url-routing,action-filter,Asp.net Mvc,Url Routing,Action Filter,我有下面的情况,我想接受下面的失败 '/type/view/23' or '/type/view/hats' 其中23是帽子的Id 控制器的外观如下所示: public class TypeController { [AcceptVerbs(HttpVerbs.Get)] public ActionResult View(int id) { ... } } 现在,如果他们通过23个考试,没有问题。如果他们通过帽子,我有一些工作要做。现在我想知道

我有下面的情况,我想接受下面的失败

 '/type/view/23' or '/type/view/hats'
其中23是帽子的Id

控制器的外观如下所示:

public class TypeController
{ 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult View(int id)
    {
      ...
    }
}
现在,如果他们通过23个考试,没有问题。如果他们通过帽子,我有一些工作要做。现在我想知道,在本例中,我是否可以通过使用ActionFilter将hats转换为23,以查看作为id传入的值是否是int(如果是,请检查它是否存在于数据库中),或者它是否是字符串,以查找数据库中传入的字符串的id是什么。无论哪种情况,如果没有找到匹配项,我都希望将用户重定向到其他操作

首先是我命名为correct的方法,其次是可以从ActionFilter中执行重定向

干杯
安东尼不确定你能做到这一点。我认为您需要传入一个字符串,然后检查它是否是数字,但可能有更好的方法

至于重定向使用

return RedirectToAction("MyProfile", "Profile");
您可以将路由值作为RedirectToAction调用的一部分进行传递,以便在需要时传入id或名称等


还有其他的方法,比如重定向到路由,这也可能有助于满足您的需要。

更改您的签名以接受字符串。然后检查id的值是否为int。如果是,则按id查找,如果不是按名称查找。如果找不到匹配项,则执行重定向

public class TypeController
{ 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult View(string id)
    {
       Product product = null;
       int productID = -1;
       if (int.TryParse( id, out productID))
       {
           product = db.Products
                       .Where( p => p.ID == productID )
                       .SingleOrDefault();
       }
       else
       {
           product = db.Products
                       .Where( p => p.Name == id )
                       .SingleOrDefault();
       }

       if (product == null)
       {
           return RedirectToAction( "Error" );
       }
       ...
    }
}

我这样做的原因是为了知道要应用什么控制器/操作,框架将寻找一个与传入的路由数据的签名匹配的控制器/操作。如果您没有匹配的签名(在本例中为带字符串的签名),则在调用任何筛选器之前,都会出现异常。不幸的是,我不认为可以有一个接受字符串的参数和另一个接受int的参数——在这种情况下,如果传递单个参数,框架将无法判断应该匹配哪个参数,至少如果它是一个数字,也就是说。通过将其设置为字符串参数并自行处理转换,您可以允许框架执行其工作,并获得所需的行为—无需过滤器。

考虑为框架找到一种执行工作的方法,我可以有如下两种路由:this.\u Routes.maprote(“typint”,“type/view/{id}”,new{controller=“Type”,action=“ViewInt”},new{page=@“^\d+$”});this.\u Routes.maprote(“TypeString”,“Type/view/{id}”,new{controller=“Type”,action=“ViewString”});这样做是否值得?或者你认为只做尝试解析吗?我不知道给路由基础设施增加复杂性会带来什么好处,只是它为你做解析。我不够聪明,不知道在不实际测试它的情况下它是否能工作。就我个人而言,我可能会有两种不同的操作View和ViewByName,bo在找到正确的产品后,使用相同的私有方法生成数据。对我来说,这将更简单、更清晰。通过重定向,我想从actionfilter中执行此操作