Значение ASP.NET MVC NonAction - PullRequest
34 голосов
/ 17 июня 2011

Может кто-нибудь сказать, почему я должен использовать NonAction? Я имею в виду, что у меня есть форма с несколькими значениями отправки: Обновить, Удалить или Вставить. Поскольку все кнопки отправки имеют одинаковую общую форму, я переключаю значение отправки внутри контроллера и действую соответственно.

Как это:

public ActionResult asd(string submitButton){
     switch(submitButton){
         case "Insert":
             return Insert();
         // bla bla bla
     }
}

[NonAction]
public ActionResult Insert(){
    // some code inside here
    return View();
}

Еще раз, почему я должен использовать NonAction вместо чего-то вроде этого:

public void Insert(){
    // some code inside here
}

Ответы [ 10 ]

50 голосов
/ 17 июня 2011

Вы можете опустить атрибут NonAction, но тогда метод по-прежнему будет вызываться как метод действия.

С сайта MSDN ( ref ):

По умолчанию среда MVC рассматривает все открытые методы класса контроллера как методы действия. Если ваш класс контроллера содержит открытый метод и вы не хотите, чтобы он был методом действия, вы должны пометить этот метод атрибутом NonActionAttribute.

13 голосов
/ 22 сентября 2012

Стоит отметить, что необходимость использования [NonAction] распространяется только на публичные методы. Защищенные и частные методы не рассматриваются как действия. Поскольку ваши Update / Delete / Insert методы являются помощниками для asd(), для вашего сценария больше подойдет частный метод:

public ActionResult asd(string submitButton){
    switch(submitButton){
        case "Insert":
            return Insert();
        // bla bla bla
    }
}

ActionResult Insert(){
    // some code inside here
}
5 голосов
/ 27 сентября 2013

Чтение статьи Хаака

Любой открытый метод в классе контроллера вызывается через URL.

Иногда вам может понадобиться избежать этого. Например, если вы реализуете какой-то интерфейс и не хотите вызывать этот открытый метод, вы можете пометить его как NonAction

public interface IEmployee
{
 void Save(Employee e);
 bool Validate(Employee e);
}

public class EmployeeController:Controller, IEmployee
{
  public void Save(Employee e){
  }

  [NonAction]
  public void Validate(Employee e){
  }
}
5 голосов
/ 17 июня 2011

Если вы не используете атрибут [NonAction], тогда кто-то может вызвать ваше действие напрямую, вместо того, чтобы выполнять функцию «asd»

2 голосов
/ 16 ноября 2017

Я просто использовал [NonAction] в нашем веб-интерфейсе для украшения набора методов контроллера (конечных точек), потому что в последний момент мы приняли решение отложить доставку конкретных конечных точек.

Так что это полезно, если вы хотите избежать предоставления конечной точки API, но при этом хотите сохранить реализацию на потом.

Так что я использовал этот атрибут, и он сэкономил мне много времени.

Я просто удалю его в следующем выпуске, и он просто будет там!

2 голосов
/ 04 августа 2014

Атрибут NonAction делает действие недоступным из панели навигации. Например, если у вас есть действие, которое удаляет элементы в базе данных, вы должны добавить атрибут NonAction, чтобы сделать его недоступным для пользователей.

0 голосов
/ 30 октября 2017

Это указывает на то, что метод контроллера не является методом действия. Пример: [NonAction] public void IndexTest () {// Делать что-то} это очень полезный атрибут, когда видимость метода контроллера не может быть изменена на частную .

0 голосов
/ 21 июня 2017

Если вы не хотите вызывать какие-либо методы действия, вы должны пометить его атрибутом [NonAction] или сделать его закрытым

public ActionResult Index(){
    return View();
}

[NonAction]
public ActionResult Countries(List<string>countries){
    return View(countries);
}

Вы можете скопировать код, вставить его и посмотреть результат. Спасибо

0 голосов
/ 02 июня 2017

Во-первых, думайте о ActionResult просто как о конкретном типе конструкции, возвращаемой MVC, которая обеспечивает особое удобство с точки зрения способа внутренней обработки ActionResult в рамках MVC.Поэтому тот факт, что что-то является ActionResult , не обязательно означает «, это должно быть общедоступным ».Фактически, любой открытый метод в контроллере MVC будет рассматриваться как метод действия, независимо от того, возвращает ли он ActionResult .

Таким образом, просто имея возвращаемый тип, который isn't ActionResult не обязательно предотвратит раскрытие этого метода как общедоступного действия, которое может быть вызвано через URL.

Может быть много причин, по которым вы этого не делаетехотите представить метод как действие, которое может быть вызвано через URL, и в случае, если вы хотите «защитить» от этого, именно тогда вы используете атрибут [NonAction '].

0 голосов
/ 14 февраля 2017

Это атрибут, который используется в методах, которые определены модификаторами публичного доступа.На самом деле MVC Framework обрабатывает все общедоступные методы как URL-адреса, но в случае, если вы этого не хотите, вы должны украсить метод атрибутом non action.То же самое можно сделать, сделав метод закрытым.

Пример атрибута NonAction приведен ниже.http://yogeshdotnet.com/non-action-attribute-in-mvc/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...