Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NETMVC中动态创建路由参数_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

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"