ASP.NET MVC 2中的httppost,httpput等属性如何工作?

Tom*_*han 6 c# http-method action-filter asp.net-mvc-2

在ASP.NET MVC 2中,引入了一些新的动作过滤器属性,作为ASP.NET MVC 1中属性的"简写"; 例如,应用与HttpPostAttribute执行[AcceptVerbs(HttpVerbs.Post)]操作方法相同的操作.

此外,使用更详细的语法,可以组合不同的方法,以便例如允许PostDelete.

现在我想知道:新属性如何工作?如果我申请两个[HttpPost][HttpDelete],将ASP.NET MVC 2 允许两个或需要两者(从而使没有)?

tva*_*son 5

查看ActionMethodSelector的代码,在将该操作添加到可能的匹配方法集之前,似乎所有操作方法属性必须为IsValidForRequest返回true.由于HttpPost和HttpDelete不可能为同一个请求返回IsValidForRequest,我希望使用这两个请求可以防止该操作匹配任何请求.

这是代码中的一个有说服力的评论:

private static List RunSelectionFilters(...){
//删除所有选择退出此请求的方法
//选择退出,方法上定义的至少一个属性必须返回false

(强调我的)

请注意,如果您需要匹配,您仍然可以使用AcceptVerbs并显式OR动词.

编辑 - 这是你的HttpPostOrDelete属性.

[AttributeUsage( AttributeTargets.Method, AllowMultiple = false, Inherited = false )]
public class HttpPostOrDeleteAttribute : ActionMethodSelectorAttribute
{
    private static readonly AcceptVerbsAttribute _innerPostAttribute = new AcceptVerbsAttribute( HttpVerbs.Post );
    private static readonly AcceptVerbsAttribute _innerDeleteAttribute = new AcceptVerbsAttribute( HttpVerbs.Delete );

    public override bool IsValidForRequest( ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo )
    {
        return _innerDeleteAttribute.IsValidForRequest( controllerContext, methodInfo )
               || _innerPostAttribute.IsValidForRequest( controllerContext, methodInfo );
    }
}
Run Code Online (Sandbox Code Playgroud)