ActionResult具有不同的参数

时间:2015-03-25 13:27:14

标签: c# asp.net asp.net-mvc asp.net-mvc-4 actionresult

我在ASP.NET MVC中有一个关于ActionResult行为的简单问题。

我需要有两个具有相同名称但参数不同的动作结果。 特别是我想要这个:

public class CarController : Controller
{
    [AuthorizeUser(AccessLevel = "New")]
    public ActionResult New()
    {
       return View("New");
    }

    [AuthorizeUser(AccessLevel = "New?type=2")]
    public ActionResult New(string type)
    {
       return View("NewCarType2");
    }
}

我知道我可以使用不同的名称重命名第二个动作结果,但是如果我想将它保持为" new"?

我尝试过route.maps但没有成功。 我认为这样做:

 public class CarController : Controller
{
    public ActionResult New (string type) {
        if(!string.IsNullOrEmpty(type) && type.Equals("2")) {
            return NewCarType2()
        else
            return New()
        }
    }
    [AuthorizeUser(AccessLevel = "New?type=2")]
    private ActionResult NewCarType2()
    {
        return View("NewCarType2");
    }
    [AuthorizeUser(AccessLevel = "New")]
    private ActionResult New()
    {
        return View("New");
    }
}

但忽略了用户授权的属性..也使用方法的签名public和属性[NoAction]。

我发现做我想做的唯一方法是使用类继承:

public class CarController : Controller
{
    public virtual ActionResult New(string type)
    {
        if (!string.IsNullOrEmpty(type) && type.Equals("2"))
            return RedirectToAction("NewCarType2", "CarOverride");
        else
            return RedirectToAction("New", "CarOverride");
    }
}  
public class CarOverrideController : CarController
{
    [AuthorizeUser(AccessLevel = "New?type=2")]
    public ActionResult NewCarType2(string type)
    {
        return View("NewCarType2");
    }
    [AuthorizeUser(AccessLevel = "New")]
    public override ActionResult New(string type)
    {
        return View("New");
    }
 }

但这是管理这种情况的正确方法(一部分写出ActionResults的名称都不同)?

2 个答案:

答案 0 :(得分:1)

有两种可能做你想做的事。

正如Puneet在评论中回复的那样,您可以按照this帖子中提到的那样重载控制器中的方法。

[ActionName("MyOverloadedName")]

您可以在控制器方法上定义Route属性,并将操作从不同的URL路由到此方法。有关进一步说明,请转到ASP.NET Tutorial

 [Route("URL")]
public ActionResult New(string type) { ... }

答案 1 :(得分:0)

我会质疑为什么你需要两个同名的路由做两件不同的事情?

如果你的所有AuthorizeUser属性都在检查用户的角色,为什么不做类似的事情:

public ActionResult New(string type)
{
    if (!string.IsNullOrWhiteSpace(type) && User.IsInRole("YOUR-ROLE-HERE"))
    {
        // Display NewCarType2 view if type requested and user is in correct role
        return View("NewCarType2");
    }

    // Default to New view if no type requested or user not in role
    return View("New");
}

这将同时捕获/new/new?type=foo个请求。