5

我有以下情况,我想接受以下路线

 '/type/view/23' or '/type/view/hats'

其中 23 是帽子的 ID。

控制器看起来像这样:

public class TypeController
{ 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult View(int id)
    {
      ...
    }
}

现在如果他们通过 23 没有问题。如果他们通过帽子,我有一些工作要做。现在我想知道在这种情况下,我是否会通过使用 ActionFilter 将 hats 转换为 23,该 ActionFilter 查看作为 id 传入的值是否是 int(如果是,请检查它是否存在于数据库中)或者它是否是字符串在数据库中查找已传入的字符串的 id 是什么。在任何一种情况下,如果找不到匹配项,我都希望将用户重定向到不同的操作。

首先是我命名为正确的方法,其次是可以从 ActionFilter 中进行重定向。

干杯安东尼

4

2 回答 2

4

更改您的签名以接受字符串。然后检查 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 - 在这种情况下,如果传递一个参数,框架将无法判断哪个应该匹配,至少如果它是一个数字,即。通过将其设为字符串参数并自行处理翻译,您允许框架完成其工作并获得您想要的行为——无需过滤器。

于 2009-06-30T02:25:53.180 回答
0

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

至于重定向使用

return RedirectToAction("MyProfile", "Profile");

您可以将路由值作为 RedirectToAction 调用的一部分传递,以便在需要时传递 id 或名称等。

还有其他一些方法,例如重定向到路线,这也可能对您想要的有所帮助。

于 2009-06-30T02:18:09.217 回答