Как атрибуты httppost, httpput и т. д. В ASP.NET MVC 2 работает?

In ASP.NET MVC 2, было введено несколько новых атрибутов фильтра действий, как "стенография" для атрибутов в ASP.NET MVC 1; например, применяя HttpPostAttribute делает то же самое, что и применение [AcceptVerbs(HttpVerbs.Post)] к методу действия.

кроме того, с более подробным синтаксисом можно комбинировать различные методы, чтобы, например, разрешить оба Post и Delete.

теперь мне интересно: как работают новые атрибуты? Если я применяю оба [HttpPost] и [HttpDelete], будет ASP.NET MVC 2 разрешить или требуются как (благодаря чему)?

4 ответов


глядя на код ActionMethodSelector, кажется, что все атрибуты метода действия должны возвращать true для IsValidForRequest, прежде чем это действие будет добавлено к набору возможных методов сопоставления. Поскольку HttpPost и HttpDelete не могут возвращать IsValidForRequest для одного и того же запроса, я ожидаю, что использование обоих предотвратит соответствие этого действия любому запросу.

вот красноречивый комментарий из кода:

частная статический список RunSelectionFilters(...) {
// удалить все методы, которые отказываются от этого запроса
// отказаться,по крайней мере один атрибут, определенный метод должен возвращать false

(выделено мной)

обратите внимание, что вы все еще можете использовать AcceptVerbs и явно или глаголы, если вам нужно соответствовать либо.

редактировать -- вот атрибут 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 );
    }
}

все фильтры в MVC - без исключения-независимы друг от друга. Ни один фильтр не является Специальным в любом месте в MVC framework. Это было преднамеренное дизайнерское решение, так что компоненты MVC framework, такие как invoker, не могут "обманывать" и обрабатывать фильтры, расположенные в двоичном файле MVC, иначе, чем фильтры, которые вы как разработчик приложений написали бы.

поэтому, когда вызывающий видит [HttpGet] и [HttpPost] в том же методе, нет специального кода для возьмите союз двух. Они исполняются независимо. И поскольку они никогда не могут вернуть true для одного и того же запроса, [HttpGet, HttpPost] эффективно исключает любой конкретный метод из метода действия.


Вы можете использовать AcceptVerbs для цепочки, например:

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

или

[AcceptVerbs("GET","POST")]
public ActionResult Customers() {
}

если поставить [HttpPost] и [HttpDelete] вместе это потребует обоих (что невозможно), я думаю. Если вы цепь [HttpGet] это тоже не сработает и т. д...

вы можете легко проверить его, просто взяв существующий [HttpPost] метод действия и добавление [HttpDelete] к нему. Почта перестанет работать.

Я не нашел никаких примеров, где мне нужно было бы связать их, как ваше предложение.