6

在 ASP.NET MVC 2 中,引入了几个新的操作过滤器属性,作为 ASP.NET MVC 1 中属性的“简写”;例如,应用 与应用到一个动作方法HttpPostAttribute做同样的事情。[AcceptVerbs(HttpVerbs.Post)]

此外,使用更冗长的语法,可以组合不同的方法,以允许同时使用PostDelete

现在我想知道:新属性是如何工作的?如果我同时应用[HttpPost]and [HttpDelete],ASP.NET MVC 2 将允许两者还是需要两者(因此不允许任何内容)?

4

4 回答 4

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 );
    }
}
于 2010-04-15T20:44:36.703 回答
4

MVC 中的所有过滤器 - 无一例外 - 彼此独立。在 MVC 框架中的任何地方都没有过滤器是特例的。这是一个有意的设计决策,因此像调用程序这样的 MVC 框架组件不能“作弊”,也不能以任何不同于您作为应用程序开发人员编写的过滤器的方式处理位于 MVC 二进制文件中的过滤器。

因此,当调用者在同一个方法上看到 [HttpGet] 和 [HttpPost] 时,没有特殊的代码可以取两者的并集。它们是独立执行的。而且由于它们永远不会为同一个请求返回 true,因此 [HttpGet, HttpPost] 有效地将任何特定方法排除在操作方法之外。

于 2010-04-15T21:14:33.133 回答
3

您可以使用 AcceptVerbs 进行链接,例如:

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult Customers() {
}

或者

[AcceptVerbs("GET","POST")]
public ActionResult Customers() {
}
于 2010-10-23T00:55:46.953 回答
0

如果你把它放在[HttpPost]一起[HttpDelete],我认为两者都需要(这是不可能的)。如果你链接[HttpGet]它也不会工作,等等......

您可以轻松地测试它,只需采用现有的[HttpPost]操作方法并添加[HttpDelete]到它。帖子将停止工作。

我还没有找到任何需要像你建议的那样链接它们的例子。

于 2010-04-15T20:44:10.923 回答