我的ASP.NET MVC站点中有一些具有一个参数的Actions。所有这些操作的第一行代码都会检查参数是否为null,如果是,则重定向到允许它们为参数选择值的页面。
例如:
public ActionResult Summary(string client)
{
if (String.IsNullOrEmpty(client))
return RedirectToAction("Select");
return View();
}
我想创建一个类似于上面代码的属性,所以我不必在每个动作中重复它。类似的东西:
[ClientRequired]
public ActionResult Summary(string client)
{
return View();
}
然后ClientRequiredAttribute将检查客户端参数的值,如果它为空/ null,则重定向到选择客户端页面。这样的属性可能吗?
-shnar
答案 0 :(得分:1)
是的,这是可能的。
这将是这样的:
public class ClientRequiredAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
object parameter = null;
filterContext.ActionParameters.TryGetValue("client", out parameter);
var client = parameter as string;
if (string.IsNullOrEmpty(client))
{
var urlHelper = new UrlHelper(filterContext.Controller.ControllerContext.RequestContext);
var url = urlHelper.Action("Select", "ControllerName");
filterContext.Result = new RedirectResult(url);
}
}
}
PS:未经测试,但应该可以使用。
答案 1 :(得分:0)
在ASP.NET MVC 5中,您可以使用属性路由。
http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx
public class ReviewsController : Controller
{
// eg: /reviews
[Route("reviews")]
public ActionResult Index() { ... }
// eg: /reviews/5
[Route("reviews/{reviewId}")]
public ActionResult Show(int reviewId) { ... }
// eg: /reviews/5/edit
[Route("reviews/{reviewId}/edit")]
public ActionResult Edit(int reviewId) { ... }
}