MVC: какой код вызывается при нажатии кнопки "отправить"?

Вопрос о MVC newbie; Я учусь, играя вокруг, а не Чтение руководства...:)

Я вижу, когда я создаю представление "Изменить", что в автогенерированном представлении есть кнопка "отправить":

<input type="submit" value="Save" />

Но какой код вызывается за кулисами для этого? В частности, модель, лежащая в основе этого представления, имеет свою собственную логику сохранения в коде, которую я бы хотел назвать. Как получить представление для вызова моего кода вместо того, чтобы какой-либо стандартный код вызывался невидимо за кулисами?

Ответ 1

Он будет вызывать любой открытый метод действия, который действие формы указывает на ваш контроллер. Затем вы можете вызвать save в модели представления.

    public virtual ActionResult Save(MyViewModel model) {
        model.Save();            

        --- more code to do stuff here
    }

Установите действие формы на MyController/Save

Вы также можете использовать using (Html.BeginForm... в своем коде, чтобы указать форму на конкретный метод действий на определенном контроллере.

Ответ 2

Это не кнопка, которая определяет, что происходит, но сама форма. Кнопка типа submit (по одной форме) просто запускает отправку формы, которая обрабатывается самой формой.

Форма имеет действие - например:

<form name="input" action="users/save" method="post">
    <!-- Form content goes here -->
    <input type="submit" value="Submit" />
</form>

Действие - это URL-адрес, и происходит то, что браузер собирает значения всех полей в форме (<input...>) и отправляет их указанному URL-адресу.

В ASP.NET формы MVC обычно определяются с помощью Html-помощников, поэтому создание URL-адреса для действия формы передается ASP.NET MVC. Для приведенного выше примера:

<% using(Html.BeginForm("Save", "Users")) %>
<% { %>
    <!-- Form content goes here -->
    <input type="submit" value="Save" />
<% } %>

Что в этом случае создаст url /users/save, и форма отправит на этот url. Это в терминах вызовет маршрутизацию ASP.NET, которая будет обрабатывать URL-адрес /users/save и разбивать его на куски, чтобы он знал, что он должен вызывать метод действия "Сохранить" в классе контроллера "Пользователи". Затем он прочитает все пары имени и имени входящего поля и попытается сопоставить их с именами параметров метода, если они есть.

Ответ 3

когда вы нажимаете кнопку "Отправить", запрос переходит к HTTp-модулю, который направляет его на соответствующее действие контроллера. когда редактируемое представление создается из шаблона, почтовый адрес формы такой же, как и в форме редактирования. Если вы посещаете /home/edit, вы можете увидеть следующий html в теге открытия формы

<form method="post" action="/home/edit">

у вас может быть другой метод действий, который принимает только сообщения, такие как

[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
      //put your logic here handling submitted values
}

Атрибут HttpPost указывает, что он будет обрабатывать только почтовый запрос, а не запрос, используемый для визуализации формы

Ответ 4

он вызывает метод Action, определенный в части действия элемента формы например:

<form action="/Account/LogOn" id="loginForm" method="post"> 

Действие LogOn в контроллере учетной записи будет вызываться в этой форме

Ответ 5

В ViewPage есть метод BeginForm using (Html.BeginForm() вверху, который отобразит FormTag. Этот метод имеет перегрузку, которая принимает имя ActionName и имя контроллера. Таким образом, вы можете указать действие в своем контроллере, который должен быть вызван.