Asp.net mvc ASP.NETMVC路由问题

Asp.net mvc ASP.NETMVC路由问题,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我有一个关于MVC路由的简单问题。如何构造Html.ActionLink生成以下链接 现在是 另外,我想避免在URL中提及操作名称 这是我的代码: 路线: routes.MapRoute(null, "Phones/{brand}", new { controller = "Phones", action = "Index", brand = UrlParameter.Optional }); 控制器: MySyteDBEntities ms = new MySyteDBEntities()

我有一个关于MVC路由的简单问题。如何构造Html.ActionLink生成以下链接 现在是 另外,我想避免在URL中提及操作名称 这是我的代码:

路线:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });
控制器:

MySyteDBEntities ms = new MySyteDBEntities();

public ActionResult Index()
{
    ViewBag.Brand = ms.Phones.Select(x => x.Brand).Distinct();
    return View();            
}

public ActionResult Brand(string brand)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}
索引视图代码:

@foreach (string item in ViewBag.Brand)
{                    
    <div>@Html.ActionLink(item, "Brand", new { brand = item })</div>
}

尝试此路由应在默认路由之前注册(如果有)

        routes.MapRoute(
         "Phones", // Route name
         "Phones/{[^(Index)]brand}", // URL with parameters
         new { controller = "Phones", action = "Brand", brand = "" } // Parameter defaults
     );
有了这个,->应该转到索引操作并
->应转到品牌行动。

尝试此路线应在默认路线之前注册(如果有)

        routes.MapRoute(
         "Phones", // Route name
         "Phones/{[^(Index)]brand}", // URL with parameters
         new { controller = "Phones", action = "Brand", brand = "" } // Parameter defaults
     );
routes.MapRoute(null, "Phones/{id}", 
new { controller = "Phones", action = "Index", id= UrlParameter.Optional })

public ActionResult Brand(string id)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}
有了这个,->应该转到索引操作并 ->应该去品牌行动

routes.MapRoute(null, "Phones/{id}", 
new { controller = "Phones", action = "Index", id= UrlParameter.Optional })

public ActionResult Brand(string id)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}
通过使用id作为参数名,它将阻止路由使用querystring键值对

您的无参数GET和View代码应该在没有任何更改的情况下仍然可以工作

通过使用id作为参数名,它将阻止路由使用querystring键值对


您的无参数GET和View代码应仍能正常工作,无需任何更改。

在MapRoute中,您没有空间执行操作,因此asp.net将始终使用默认操作索引

默认情况下,您的路由如下所示:

routes.MapRoute(" Default", "{controller}"/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
你错过了动作部分

actionlink中与路由中的参数不匹配的RouteValue将成为querystring参数。因此,您需要在路线中将类别更改为品牌

试试这个:

routes.MapRoute(null, "Phones/{brand}", 
 new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });


如果当前视图通过另一个路由映射,请确保在ActionLink中显式调用控制器,否则它无法识别brand参数。

在MapRoute中,您没有空间进行操作,因此asp.net将始终使用默认操作索引

默认情况下,您的路由如下所示:

routes.MapRoute(" Default", "{controller}"/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
你错过了动作部分

actionlink中与路由中的参数不匹配的RouteValue将成为querystring参数。因此,您需要在路线中将类别更改为品牌

试试这个:

routes.MapRoute(null, "Phones/{brand}", 
 new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });


如果当前视图通过其他路径映射,请确保在ActionLink中显式调用控制器,否则它无法识别brand参数。

如果我没记错,{brand}部分需要作为参数的一部分包括在内:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

请记住,它需要在任何默认路由之前进行。

如果我没有记错,则需要将{brand}部分作为参数的一部分包括在内:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

请记住,它需要在任何默认路由之前执行。

我发现了问题的根源。我只需要删除MapRoute中的最后一个brand可选参数。代码为:

routes.MapRoute(null, "Phones/{brand}", new { controller = "Phones", action = "Brand" });

我发现了问题的根源。我只需要删除MapRoute中的最后一个brand可选参数。代码为:

routes.MapRoute(null, "Phones/{brand}", new { controller = "Phones", action = "Brand" });

第二个标记在MapRoute中称为brand。在actionlink中,它被称为category。如果你在两个地方都称它为相同的,那么它应该会起作用。第二个标记在MapRoute中称为brand。在actionlink中,它被称为category。如果你在两个地方都这么说,那应该行得通。嗨,安德鲁!谢谢你的评论。我没有更改变量名。所以我的代码看起来和你建议的一样,并且生成了链接:我想你还没有解决你的问题,而不是@Sergey。尝试使用下一个重载:@Html.ActionLinkPhoneHome,Index,Phones,new{brand=Samsung},null,因为您没有在ActionLink MVC中明确指定控制器,它将映射到视图的当前控制器。我的猜测是,当前视图未映射到新路线,因此无法识别品牌参数Hi Andrew!谢谢你的评论。我没有更改变量名。所以我的代码看起来和你建议的一样,并且生成了链接:我想你还没有解决你的问题,而不是@Sergey。尝试使用下一个重载:@Html.ActionLinkPhoneHome,Index,Phones,new{brand=Samsung},null,因为您没有在ActionLink MVC中明确指定控制器,它将映射到视图的当前控制器。我的猜测是,当前视图未映射到新路由,因此无法识别品牌参数谢谢Scott,将变量名更改为id有帮助,但我仍然看到其中包含控制器名的路径,我可以避免吗?传递给控制器的两个变量又如何?只有一个变量可以称为id,将变量名更改为id会有所帮助,但我仍然看到其中包含控制器名的路径,我可以避免吗?传递给控制器的两个变量呢?只有一个变量可以称为id