1

在我的索引页面中,我正在使用以下内容生成 url

@foreach(var c in ViewBag.cities)
{
   <li>@Html.ActionLink((string)c.CityName,"somepage",new{city=c.CityName, id=c.Id})</li>
}

它为每个城市生成以下格式的网址

localhost:55055/1/city1
localhost:55055/2/city2
...

其中 1,2 是 Id 和 city1, city2 是 CityName

我已将路线配置为

routes.MapRoute(
            name: "CityRoute",
            url: "{id}/{city}",
            defaults: new { controller = "Home", action = "somepage", id = UrlParameter.Optional, city = UrlParameter.Optional }
            );

Home Controller中的somepageaction方法:

public string somepage(int id, string city)
{
  return city + " " + id;
}

即使我试过这个

public string somepage()
{
   return "Hello";
}

但它导致Resource cannot be found

我尝试在其中放置sompage永远不会被击中的断点。

任何建议

更新

正如@KD 在下面的评论中指出的那样,我更改了路线顺序并将上述规则置于所有规则之上。我也改变了方法

 public ActionResult somepage(int id=0, string city="")
 {
    return Content(city + " " + id);
 }

现在行为改变了,默认规则

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

不用于普通索引页。相反,使用这种用法是因为方法中的断点somepage被命中,如果我把它放在http://localhost:55055/2/cityname浏览器中,页面会显示 id 和 cityname。但是现在默认路由不用于应用程序主页http://localhost:55055/

4

2 回答 2

4

您的新路线的模式和默认路线的模式几乎相同,因此它总是会产生冲突以匹配这些路线..将您的路线更改为跟随

routes.MapRoute(
            name: "CityRoute",
            url: "CitySearch/{id}/{city}",
            defaults: new { controller = "Home", action = "somepage", id = UrlParameter.Optional, city = UrlParameter.Optional }
            );

即为您的模式添加一些前缀,以便它可以轻松识别..比如“CitySearch”,然后在为其提供操作链接的同时提及您的路线名称..

或者,如果您不想为其添加前缀,请执行以下操作,它会像魅力一样工作..

为您的 CityRoute 添加一个 Route Constraint for Id,它将检查 ID 字段是否为整数。对于普通 URL,它将返回 false,因此您的默认路由将被评估......试试这个......

routes.MapRoute(
            name: "CityRoute",
            url: "{id}/{city}",
            defaults: new { controller = "Home", action = "somepage", id = UrlParameter.Optional, city = UrlParameter.Optional },
            constraints: new {id = @"\d+"}
            );

这是正则表达式约束。把这条路线放在顶部并检查。

于 2013-03-12T09:18:22.117 回答
0

由于您尚未定义 Action 它不会被调用,因此错误即将到来

尝试这个,

public ActionResult somepage(int id, string city)
    {
        return Content(city + " " + id);
    }
于 2013-03-12T08:46:01.783 回答