我在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的名称都不同)?
答案 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
个请求。