Подтвердить что ты не робот

Значение параметра ASP.NET MVC NonAction

Кто-нибудь может сказать мне, почему я должен использовать NonAction? Я имею в виду, что у меня есть форма с несколькими значениями: Update, Delete или Insert. Поскольку все кнопки отправки имеют одну и ту же форму, я переключаю значение представления внутри контроллера и действую соответственно.

Вот так:

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
}
4b9b3361

Ответ 1

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

С сайта MSDN (ref):

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

Ответ 2

Следует отметить, что необходимость использования [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
}

Ответ 3

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

Ответ 4

Статья с читающей стеной

Любой открытый метод в классе контроллера может быть вызван через 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

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

Ответ 6

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

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

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

Я просто удалю его в следующей версии, и это будет просто!

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

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