ASP.NET MVC 2针对同一路由的动作?

时间:2011-12-22 08:03:53

标签: asp.net asp.net-mvc routing

假设我已经定义了这样的路线,

        context.MapRoute(
            "Preview",
            "/preview/{id}/{type}",
            new { controller = "Preview", action = "Invoice", id = UrlParameter.Optional, type = UrlParameter.Optional }
        );

我有带动作发票的控制器

public ActionResult(int id, string type)
{
  if (type == "someType") 
  {
    // ...
  } 
  else
  {
    // ..
  }
}

我想摆脱动作中的If-Else案例。是否有可能以某种方式归因于动作,因此ASP.MVC将区分两者,例如:

只是一个假想法?

[HttpGet, ActionName("Action"), ForParameter("type", "someType")]
public ActionResult PreviewSomeType(int id) {}

[HttpGet, ActionName("Action"), ForParameter("type", "someType2")]
public ActionResult PreviewSomeType2(int id) {}

在MVC2 / 3中是否可以这样?

2 个答案:

答案 0 :(得分:4)

动作方法选择器

您需要的是一个动作方法选择器,它完全按照您所描述的内容执行完全用于此目的,因此这不是一种解决方法,因为它将使用不同的路由定义或任何其他方式。自定义操作方法选择器属性解决方案不是解决方法。

我写过两篇博文,可以帮助您开始使用Asp.net MVC中的操作方法选择以及这些属性:

答案 1 :(得分:0)

我认为这就是路由的用途。 只需将您的单条路线分成两部分:

context.MapRoute(null, "preview/{id}/SomeType",
        new { 
              controller = "Preview", 
              action = "Action1", 
              id = UrlParameter.Optional, 
            }
    );

context.MapRoute(null, "preview/{id}/SomeOtherType",
        new { controller = "Preview", 
              action = "Action2", 
              id = UrlParameter.Optional, 
            }
    );

或者更一般,使用最后一个段作为操作名称:

context.MapRoute(null, "preview/{id}/{action}",
        new { controller = "Preview",
              id = UrlParameter.Optional, 
            }
    );

但我认为,可选段必须出现在最后。那么为什么不使用默认路由模式

controller/action/id