【问题标题】:ASP.Net MVC: Map route according to parameter valueASP.Net MVC:根据参数值映射路由
【发布时间】:2023-03-31 17:46:01
【问题描述】:

我正在尝试在网站上创建类似向导的工作流程,并且每个步骤都有一个模型。

我有以下操作方法:

public ActionResult Create();
public ActionResult Create01(Model01 m);
public ActionResult Create02(Model02 m);
public ActionResult Create03(Model03 m);

我希望用户将地址视为

/Element/Create
/Element/Create?Step=1
/Element/Create?Step=2
/Element/Create?Step=3

所有模型类都继承自具有 Step 属性的 BaseModel。 具有参数的操作方法具有正确的 AcceptVerbs 约束。

我尝试将所有方法命名为 Create,但这导致了 AmbiguousMatchException。

我现在想做的是为每个动作创建一个自定义路由,但我不知道该怎么做。 这是我尝试过的:

     routes.MapRoute(
        "ElementsCreation", 
        "Element/Create",
        new{controller="Element", action="Create01"},
        new{Step="1"}
        );

但这不起作用。

任何帮助(关于正确的 MapRoute 调用或可能是不同的方法)将不胜感激。

谢谢

【问题讨论】:

    标签: asp.net-mvc routing wizard maproute


    【解决方案1】:

    我实际上找到了一种不同的方法。

    我没有添加新的 Route Map,而是创建了一个新的 Action Method 属性来验证传递的请求是否对每个操作方法都有效。

    这是属性类:

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class ParameterValueMatchAttribute : ActionMethodSelectorAttribute
    {
       public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
       {
          var value = controllerContext.RequestContext.HttpContext.Request[Name];
          return (value == Value);
       }
    
       public string Value { get; set; }
       public string Name { get; set; }
    }
    

    而且我每个动作方法都具有相同的名称并装饰如下:

    [AcceptVerbs(HttpVerbs.Post)]
    [ParameterValueMatch(Name="Step", Value="1")]
    public ActionResult Create(Model01 model)
    

    我更喜欢这种方法,而不是为每种方法创建一条路线。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 2012-09-03
      • 2011-04-10
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      相关资源
      最近更新 更多