检查参数的MVC Action Attribute有值吗?

时间:2014-12-16 17:58:46

标签: c# asp.net asp.net-mvc attributes

我的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

2 个答案:

答案 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) { ... } 
}