Как атрибуты 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]
к нему. Почта перестанет работать.
Я не нашел никаких примеров, где мне нужно было бы связать их, как ваше предложение.