В ASP.NET MVC 2 несколько новых атрибутов фильтра действия были представлены как "сокращение" от атрибутов в ASP.NET MVC 1; например, применение HttpPostAttribute
делает то же самое как применение [AcceptVerbs(HttpVerbs.Post)]
к методу действия.
Кроме того, с более подробным синтаксисом, возможно объединить различные методы, чтобы позволить, например, обоим Post
и Delete
.
Теперь я задаюсь вопросом: как новые атрибуты работают? Если я применяю обоих [HttpPost]
и [HttpDelete]
, ASP.NET MVC 2 позволит обоим или потребует обоих (таким образом разрешение ничего)?
Глядя на код ActionMethodSelector, кажется, что все атрибуты метода действия должны возвращать значение true для IsValidForRequest, прежде чем это действие будет добавлено к набору возможных методов сопоставления .Поскольку HttpPost и HttpDelete не могут вернуть IsValidForRequest для одного и того же запроса, я ожидаю, что использование обоих предотвратит совпадение этого действия с любым запросом.
Вот показательный комментарий из кода:
private static List RunSelectionFilters (...) {
// удаляем все методы, которые отказываются от этого запроса
{{1 }} // чтобы отказаться, по крайней мере один атрибут, определенный в методе, должен возвращать 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 нет фильтров с особым регистром. Это было намеренное дизайнерское решение, чтобы компоненты инфраструктуры MVC, такие как вызывающая сторона, не могли «обмануть» и обрабатывать фильтры, расположенные в двоичном файле MVC, иначе, чем фильтры, которые вы, как разработчик приложения, написали бы.
Поэтому, когда вызывающая сторона видит [HttpGet] и [HttpPost] в одном методе, не существует специального кода для объединения этих двух значений. Они выполняются независимо. И поскольку они никогда не могут вернуть истину для одного и того же запроса, [HttpGet, HttpPost] эффективно исключает любой конкретный метод из метода действия.
Если вы поместите [HttpPost]
и [HttpDelete]
вместе, потребуются оба (что не является возможно) думаю. Если связать [HttpGet]
, он тоже не будет работать и т. Д.
Вы можете легко проверить это, просто взяв существующий метод действия [HttpPost]
и добавив [HttpDelete]
к нему. Пост перестанет работать.
Я не нашел ни одного примера, где мне нужно было бы связать их, как вы предлагаете.