Asp.net mvc 在ASP.NETMVC中动态创建路由参数
我的要求是能够接受以下组合Asp.net mvc 在ASP.NETMVC中动态创建路由参数,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我的要求是能够接受以下组合 {Part1}/{Controller}/{Action} {Part1}/{Part2}/{Controller}/{Action} {Part1}/{Part2}/{Part3}/{Controller}/{Action} 并将它们传递到控制器和方法中,这些控制器和方法将第1部分到第3部分转换为整个系统都使用的ID。该计划是: string id = part1 + "-" + part2 + "-" + part3 路由以这种方式组织,以提供文件夹结构的
{Part1}/{Controller}/{Action}
{Part1}/{Part2}/{Controller}/{Action}
{Part1}/{Part2}/{Part3}/{Controller}/{Action}
并将它们传递到控制器和方法中,这些控制器和方法将第1部分到第3部分转换为整个系统都使用的ID。该计划是:
string id = part1 + "-" + part2 + "-" + part3
路由以这种方式组织,以提供文件夹结构的外观,控制器/操作是这些“文件夹”可用的
我想想出一个方法来做到这一点坚持干
我想这可能是一个操作过滤器(我将普遍应用),它在RouteValueDictionary中创建一个新的条目ID,从第1部分到第3部分中获取值
这是正确的方法还是有更好的解决方案
谢谢。这里有个主意
创建一些路由
示例模型
模型绑定
示例控制器
样品:
谢谢我同意ModelBinder是一个更好的地方来表达这种逻辑。我看到的唯一缺点是,如果我在多个类中使用id(如CategoryId或FolderId),它们都必须从SpecialModel继承。对吗?有没有一种方法可以对任何具有“id”字段的类进行编码?您可以将默认的模型绑定器更改为自己的,然后更改代码,以便它检查模型中的“id”字段,然后尽最大努力填充它。您可以使用
ModelBinders.Binders.DefaultBinder=new SpecialModelBinder()更改默认模型绑定器代码>;将其放入Startup.cs
或Global.asax
中。
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"