我的要求是能够接受以下组合
{Part1}/{Controller}/{Action}
{Part1}/{Part2}/{Controller}/{Action}
{Part1}/{Part2}/{Part3}/{Controller}/{Action}
并将它们传递给控制器和方法,这些控制器和方法将第1部分转换为3,转换为在整个系统中使用的ID。该计划是:
string id = part1 + "-" + part2 + "-" + part3
以这种方式组织路径以提供文件夹结构的外观,并且控制器/操作是那些“文件夹”可用的。
我想提出一种坚持DRY的方法。
我想也许这是一个动作过滤器(我将普遍适用),它在RouteValueDictionary中创建一个新的条目ID,从第1部分到第3部分的值中获取值。
这是正确的方法还是有更好的解决方案?
谢谢。
答案 0 :(得分:1)
这是一个想法。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Special",
url: "{part1}/{controller}/{action}"
);
routes.MapRoute(
name: "Special2",
url: "{part1}/{part2}/{controller}/{action}"
);
routes.MapRoute(
name: "Special3",
url: "{part1}/{part2}/{part3}/{controller}/{action}"
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
}
[ModelBinder(typeof(SpecialModelBinder))]
public class SpecialModel
{
public string id { get; set; }
}
public class SpecialModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
SpecialModel model = (SpecialModel)bindingContext.Model;
model.id = string.Join("-", controllerContext.RouteData.Values
.Where(x => new string[] { "part1", "part2", "part3" }.Contains(x.Key))
.Select(x => x.Value)
);
bindingContext.ModelMetadata.Model = model;
}
}
public class ManageController : Controller
{
public ActionResult Edit(SpecialModel model)
{
return View();
}
}
@Model.Id == "style1"
@Model.Id == "style1-red"
@Model.Id == "style1-red-16"