我遇到路由问题。我有新闻控制器,我可以从网址http://localhost/News/Details/1/news-title(slug)
读取新闻的详细信息。现在这没问题。但我创建了一个名为Services with Index action的控制器。路线配置:
routes.MapRoute(
"Services",
"Services/{id}",
new { controller = "Services", action = "Index" }
);
当我的索引操作
时public ActionResult Index(string title)
{
return View(title);
}
我在浏览器中手动编写localhost:5454/Services/sometext
。
但是当我将索引动作改为
时public ActionResult Index(string title)
{
Service service = _myService.Find(title);
ServiceViewModel = Mapper.Map<Service , ServiceViewModel >(service );
if (service == null)
{
return HttpNotFound();
}
return View(serviceViewModel);
}
我在Url localhost / Services / ITServices中找不到Http错误404。
我可以使用它的标题(例如ITServices)从管理页面添加此服务。 然后我在我的主页上找到了服务链接
@foreach (var service Model.Services)
{
<div class="btn btn-success btn-sm btn-block">
@Html.ActionLink(service.Title, "Index", new { controller = "Services", id = service.Title })
</div>
}
但我无法在localhost/Services/ITServices
显示该页面。
当我点击链接时,我想转到localhost / Services / ITServices页面,它必须显示内容(可以从管理页面添加),就像在新闻中一样。但我不想在新闻中使用动作名称和ID。我怎样才能做到这一点?
修改
确定。我在存储库中添加了FindByTitle(string title)
。我在RouteConfig和主页视图中的链接中将id
更改为title
。然后在我的域模型中删除了Id并将标题更新为[Key]。现在它有效。从管理页面添加新内容时,只需检查远程验证是否存在可能重复的标题。
答案 0 :(得分:2)
URL模板中的参数名称与Action(Index
)上的参数不匹配。
所以你可以做两件事之一。
更改模板参数以匹配Action
的参数routes.MapRoute(
name: "Services",
url: "Services/{title}",
defaults: new { controller = "Services", action = "Index" }
);
行动指数
public ActionResult Index(string title) { ... }
或者您更改动作索引的参数以匹配网址模板中的参数
public ActionResult Index(string id) { ... }
路线映射
routes.MapRoute(
name: "Services",
url: "Services/{id}",
defaults: new { controller = "Services", action = "Index" }
);
但无论哪种方式,路线都找不到路线,因为它与参数不匹配。
事实上,如果打算将标题用作slug,你可以使用catch所有路径来获取服务,例如
routes.MapRoute(
name: "Services",
url: "Services/{*title}",
defaults: new { controller = "Services", action = "Index" }
);
看看这里提供的答案
答案 1 :(得分:1)
试试这个:
public ActionResult Index(string id)