关于ActionNameSelectorAttribute 和 ActionMethodSelectorAttribute的区别,请参考http://www.cnblogs.com/P_Chou/archive/2010/12/01/details-asp-net-mvc-07.html
区分 [HttpPost] 和 [AcceptVerbs(HttpVerbs.Post)] .他们都是ActionMethodSelectorAttribute的子类。查看代码
[SuppressMessage("Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "The accessor is exposed as an ICollection<string>.")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class AcceptVerbsAttribute : ActionMethodSelectorAttribute { public AcceptVerbsAttribute(HttpVerbs verbs) : this(EnumToArray(verbs)) { } public AcceptVerbsAttribute(params string[] verbs) { if (verbs == null || verbs.Length == 0) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "verbs"); } Verbs = new ReadOnlyCollection<string>(verbs); } public ICollection<string> Verbs { get; private set; } private static void AddEntryToList(HttpVerbs verbs, HttpVerbs match, List<string> verbList, string entryText) { if ((verbs & match) != 0) { verbList.Add(entryText); } } internal static string[] EnumToArray(HttpVerbs verbs) { List<string> verbList = new List<string>(); AddEntryToList(verbs, HttpVerbs.Get, verbList, "GET"); AddEntryToList(verbs, HttpVerbs.Post, verbList, "POST"); AddEntryToList(verbs, HttpVerbs.Put, verbList, "PUT"); AddEntryToList(verbs, HttpVerbs.Delete, verbList, "DELETE"); AddEntryToList(verbs, HttpVerbs.Head, verbList, "HEAD"); return verbList.ToArray(); } public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) { if (controllerContext == null) { throw new ArgumentNullException("controllerContext"); } string incomingVerb = controllerContext.HttpContext.Request.GetHttpMethodOverride(); return Verbs.Contains(incomingVerb, StringComparer.OrdinalIgnoreCase); } }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class HttpPostAttribute : ActionMethodSelectorAttribute { private static readonly AcceptVerbsAttribute _innerAttribute = new AcceptVerbsAttribute(HttpVerbs.Post); public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) { return _innerAttribute.IsValidForRequest(controllerContext, methodInfo); } }
可以看作
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyTest()
完全等于
[HttpPost]
public ActionResult MyTest()
但当Action同时接受2种提交方式时。就应该使用
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Put)]
public ActionResult MyTest()
而不能用
[HttpPost]
[HttpGet]
public ActionResult MyTest()
因为一个请求不可能既是Post又是Get.
关于ActionNameSelectorAttribute , ActionMethodSelectorAttribute使用和扩展
这里给了详细的说明, 请参照