У меня простой вопрос о поведении ActionResult в ASP.NET MVC.
Мне нужно иметь два результата действия с одинаковым именем, но разными параметрами. В частности, я хочу этого:
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");
}
}
Я знаю, что могу переименовать второй результат действия другим именем, но хочу ли я оставить его «новым»?
Я пробовал с 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");
}
}
но атрибут для авторизации пользователя игнорируется.. также с публичной подписью метода и атрибутом [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 отличается)?