在Url中没有操作名称的路由

时间:2015-02-27 17:41:46

标签: asp.net-mvc asp.net-mvc-routing action

我遇到路由问题。我有新闻控制器,我可以从网址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]。现在它有效。从管理页面添加新内容时,只需检查远程验证是否存在可能重复的标题。

2 个答案:

答案 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" }
); 

看看这里提供的答案

how to route using slugs?

Dynamic routing action name in ASP.NET MVC

答案 1 :(得分:1)

试试这个:

public ActionResult Index(string id)