在ASP.Net MVC中动态创建路由参数

时间:2014-09-10 00:25:08

标签: 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

以这种方式组织路径以提供文件夹结构的外观,并且控制器/操作是那些“文件夹”可用的。

我想提出一种坚持DRY的方法。

我想也许这是一个动作过滤器(我将普遍适用),它在RouteValueDictionary中创建一个新的条目ID,从第1部分到第3部分的值中获取值。

这是正确的方法还是有更好的解决方案?

谢谢。

1 个答案:

答案 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; }
}

Model Binder

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();
    }
}

样品:

  

http://www.example.com/style1/Manage/Edit

@Model.Id == "style1"

  

http://www.example.com/style1/red/Manage/Edit

@Model.Id == "style1-red"

  

http://www.example.com/style1/red/16/Manage/Edit

@Model.Id == "style1-red-16"