此时我的控制器正在以某种方式工作,此时网址出现Home/Collections/Collection?id=1
,这是我的预期功能。但是,我现在想让网址更友好。例如,我希望它成为Home/Collections/Summer
。
我的CollectionsController
中有以下代码:
public ActionResult Index()
{
return View(Helper.Helper.ResolvePath("Collections"));
}
//
// GET: /Collections/Collection?id=1
public ActionResult Collection(int id)
{
var collectionModel = ds.GetCollection(id);
return View(Helper.Helper.ResolvePath("Collection"), collectionModel);
}
我需要更改什么才能获得理想的结果?没有为每个集合单独ActionResult
(因为它永远不会是固定数字)?
这是我的Global.asax
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
答案 0 :(得分:2)
您可以定义类似的路线,
routes.MapRoute(
"Collections", // Route name
"Collections/{name}/{id}", // URL with parameters
new { controller = "Collections", action = "Collection" ,id = UrlParameter.Optional } // Parameter defaults
);
现在在CollectionsController中,
public class CollectionsController : Controller
{
public ActionResult Collection(string name)
{
/// Your Logic here
/// name is required parameter
/// optionally you can add an id parameter
return View();
}
}
现在您的网址将像“http:// localhost:98765 / Collections / Summer”
但我不明白为什么你需要在网址主页
答案 1 :(得分:1)
鉴于以下enum
:
public enum Seasons { Summer = 1, Fall = 2, Winter = 3, Spring = 4 }
为路线映射添加自定义路线:
routes.MapRoute(
"Default", // Route name
"Home/Collections/{action}/{season}", // URL with parameters
new { controller = "Collections",
action = "Collection",
season = UrlParameter.Optional } // Parameter defaults
);
控制器操作:
public ActionResult Collection(Season season)
{
/* ... code ... */
}
答案 2 :(得分:0)
将id
参数更改为字符串,并执行查找相应ID所需的任何数据库查询。
答案 3 :(得分:-1)
除了Manas'答案之外,您还可以在Collection上添加一个“字段/列/属性”来保存URL友好名称。
并非所有名称都是URL有效名称(例如,如果您的收藏品是“50%折扣!!”,您肯定会在URL上发现意外结果http://server/Collections/50%关闭!!)
所以你可能想尝试在你的Collection中添加一个“UrlFriendlyName”,并从官方名称自动生成它:
public class Url
{
public static string GetUrlFriendlyName(string name)
{
//Unwanted: {UPPERCASE} ; / ? : @ & = + $ , . ! ~ * ' ( )
name = name.ToLower();
//Strip any unwanted characters
name = Regex.Replace(name, @"[^a-z0-9_\s-]", "");
//Clean multiple dashes or whitespaces
name = Regex.Replace(name, @"[\s-]+", " ");
//Convert whitespaces and underscore to dash
name = Regex.Replace(name, @"[\s_]", "-");
name = Regex.Replace(name, @"-+", "-");
return name;
}
}
这样,您就可以根据网址友好名称查询您的收藏集(理想情况下,它会是唯一的,但会有很多其他问题发挥作用...就像在网址中添加ID一样(http://server/Collections/Summer/1或者将随机数添加到URL友好名称,例如http://server/Collections/Summer-123,或者只是让创建集合的用户指定一个唯一的URL友好名称,从自动生成的名称开始,但如果用户不是唯一的则会失败回来。“ p>
答案 4 :(得分:-2)
要有一个像这样的Home / Collections / Summer这样的URL你需要有一个名为“Summer”的方法,你可以让它将ActionResult返回给Summer的相应id,如下所示:
public ActionResult Summer() {
return Collection(1); //where id 1 corresponds to summer
}