Как делают httppost, httpput и т.д. приписывает в работе ASP.NET MVC 2?

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

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

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

6
задан Tomas Aschan 15 April 2010 в 20:39
поделиться

3 ответа

Глядя на код 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 );
    }
}
5
ответ дан 9 December 2019 в 20:41
поделиться

Все фильтры в MVC - без исключения - независимы друг от друга. Нигде в структуре MVC нет фильтров с особым регистром. Это было намеренное дизайнерское решение, чтобы компоненты инфраструктуры MVC, такие как вызывающая сторона, не могли «обмануть» и обрабатывать фильтры, расположенные в двоичном файле MVC, иначе, чем фильтры, которые вы, как разработчик приложения, написали бы.

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

4
ответ дан 9 December 2019 в 20:41
поделиться

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

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

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

0
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: