无法找到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
中设置断点,它永远不会被击中。
正如@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/
你的新路由的模式和默认路由的模式几乎是一样的,因此它总是会产生冲突来匹配那些路由。把你的路由改为
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);
}