虚荣URL,读取输入的字符串而不是int

时间:2012-05-31 13:35:42

标签: asp.net-mvc-3 routing actionresult

我正在尝试允许虚荣网址,但我遇到的问题是,如果我进入

XXXX/User/Profile/Test

而不是

xxxx/User/Profile/224

它无法读取字符串。

我当前的ActionResult如下:

public ActionResult Profile(int ID = -1, string VanityID = null)
    {
        if (VanityID == null)
        {
            ppUser viewerChoice = DB.ppUser_GetUserByPersonID(ID);
            return View(viewerChoice);
        }
        else
        {
            ppUser viewerChoice = DB.ppUser_GetUserByVanityID(VanityID);
            return View(viewerChoice);
        }
    }

如果在URL中输入了一个int,它将接受int Id,但是如果输入了一个字符串,则不会引入任何内容并且它会引发错误,因为该ID被读为-1。

我也一直试图使用以下2个动作结果:

public ActionResult Profile(int ID)
    {
            ppUser viewerChoice = DB.ppUser_GetUserByPersonID(ID);
            return View(viewerChoice);
    }

    public ActionResult Profile(string ID)
    {
        ppUser viewerChoice = DB.ppUser_GetUserByVanityID(ID);
        return View(viewerChoice);
    }

但是当我尝试调用ActionResult时,它会向我抛出一个AmbiguousMatchException错误。

这就是routes.Maproute,如果它也有帮助的话。

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { controller = @"[^\.]*" }, // Parameter constraints
            new string[] { typeof(MvcApplication).Namespace + ".Controllers" }
        );

1 个答案:

答案 0 :(得分:1)

我觉得你快到了。请尝试setting a constraint获取ID:

new { ID = @"\d+" }

这将保证,如果您尝试访问XXXX / User / Profile / Test,您的操作将不会被命中,因为Test不是真正的id。