无法找到Asp.net MVC 4 Url资源

本文关键字:MVC Url 资源 net Asp | 更新日期: 2023-09-27 18:03:40

在我的索引页中,我使用以下

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

生成每个城市的url,格式如下

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中的somepage动作方法:

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

我也试过了

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

但结果是Resource cannot be found

我试着在sompage中设置断点,它永远不会被击中。

任何suggesstions

正如@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和城市名称。但是现在默认路由不用于应用程序主页http://localhost:55055/

无法找到Asp.net MVC 4 Url资源

你的新路由的模式和默认路由的模式几乎是一样的,因此它总是会产生冲突来匹配那些路由。把你的路由改为

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

。添加一些前缀到你的模式,这样它可以很容易地被识别。像"CitySearch"然后在提供Action链接的同时提到你的路由名…

或者,如果你不想添加前缀,那么做下面的事情,它会像一个魅力…

为你的CityRoute添加一个Route Constraint For Id,它将检查Id字段是否为Integer。对于普通的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+"}
            );

这是正则表达式约束。

由于您没有定义Action,因此它不会被调用,因此会出现错误

试试这个,

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