ASP.NET MVC控制器属性的必需参数

时间:2012-07-11 05:31:32

标签: asp.net-mvc controller

有没有办法用强制参数创建ASP.NET MVC属性?

[MyPersonalAttribut(MyMandatoryValue="....")]
public ActionResult Index()
{

    return View();
}

谢谢,

3 个答案:

答案 0 :(得分:0)

简单的方法是为索引方法

设置一个不可为空的参数
   public ActionResult Index(int id)
   { 
     return View();
   }

需要有效的int来导航

答案 1 :(得分:0)

您可以尝试这样的事情,

动作过滤器

public class MandatoryAttribute: FilterAttribute, IActionFilter
{
    private readonly string _requiredField;

    public MandatoryAttribute(string requiredField)
    {
        _requiredField = requiredField;
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var val = filterContext.Controller.ValueProvider.GetValue(_requiredField);

        if (val == null || string.IsNullOrEmpty(val.AttemptedValue))
            throw new Exception(string.Format("{0} is missing"),
                            _requiredField);
    }
}

<强>动作

[Mandatory("param")]
public ActionResult MyTest()
{
  return Content("OK");
}

答案 2 :(得分:0)

您可以通过在Attribute中只有一个带有一个参数的构造函数来轻松完成此操作。像这样:

public class MyPersonalAttribute : Attribute
{
    public object MyMandatoryValue { get; private set; }

    // The only constructor in the class that takes one argument...
    public MyPersonalAttribute(object value)
    {
        this.MyMandatoryValue = value;
    }
}

然后,如果在使用如下所示的属性时未提供参数,则会收到编译错误:

这将有效:

[MyPersonalAttribute("some value")]
public ActionResult Index()
{
    return View();
}

这会给你一个编译错误:

[MyPersonalAttribute()]
public ActionResult Index()
{
    return View();
}