Отправка формы для правильного действия с использованием ASP.NET и MVC - PullRequest
3 голосов
/ 27 марта 2009

У меня есть простая форма, которая используется для обновления объекта в моем приложении ASP.NET MVC. Я хочу, чтобы пользователь мог отправить форму, вызвать соответствующее действие на моем контроллере, а затем уведомить пользователя о завершении обновления.

Поскольку я хотел отобразить диалоговое окно JQuery после того, как пользователь нажимает кнопку обновления, я хотел использовать JQuery для отправки формы. Однако моя проблема заключается в следующем:

Хотя я могу легко заставить JQuery вызывать действие на моем контроллере, я не могу заставить его вызывать действие, которое я уже настроил на своем маршруте и которое было украшено [Authorize] и [AcceptVerbs(HttpVerbs.Post)]

Например, если пользователь обновляет свою сущность по следующему URL:

/SomeController/Edit/5

Когда JQuery отправляет форму, я хочу отправить ее в свое редактируемое действие, которое уже оформлено и принимает идентификатор в качестве параметра.

JQuery, который я использую для публикации формы, выглядит следующим образом:

$("#formFoo").submit(function() {
                var frm = $("#formFoo");
                var action = frm.attr("action");
                var serializedForm = frm.serialize();
                $.post(action, serializedForm, function() {
                    alert('Call completed');
                });
                return false;
            });

Если я определю свою форму следующим образом:

<form id="formFoo" action="/SomeController/SomeOtherAction" method="post">

и мои действия следующим образом:

public void SomeOtherAction() 
{
    var myEntity=new MyEntity();
    UpdateModel(myEntity);
}

Затем вызывается мое действие, и мой объект заполняется правильно, но его поле идентификатора не заполняется, поэтому я не знаю, какую сущность я обновляю.

Если я изменю свою форму на:

<form id="formFoo" action="/SomeController/Edit" method="post">

и у меня есть действие Правка, определенное как:

[Authorize,AcceptVerbs(HttpVerbs.Post)]
public void Edit(int id, FormCollection collection)

Тогда мое действие никогда не вызывается JQuery.

Полагаю, я мог бы каким-то образом извлечь параметр ID из строки запроса и вставить это в данные, которые я отправляю обратно в форму, но это выглядит очень уродливо. Или есть ли способ получить поле идентификатора, когда я в своем действии SomeOtherAction? Или я просто все делаю неправильно?

Ответы [ 2 ]

3 голосов
/ 27 марта 2009

При звонке:

$.post(action

Тогда аргумент "action" должен включать идентификатор. В своем вопросе вы не говорите, что это такое во время выполнения, но я сильно подозреваю, что оно не включает идентификатор. На основе вашего примера URI для действия «Изменить» идентификатор должен быть в пути URI, а не в запросе. С маршрутом MVC по умолчанию это не должно иметь никакого значения, но, не зная, какие у вас маршруты, я бы сказал, что вам следует придерживаться формата URI, который вы задаете в вопросе.

Поэтому установите firebug, если вы этого еще не сделали, установите точку останова в JavaScript и проверьте значение аргумента действия.

Если он по-прежнему выглядит правильно, откройте панель «Сеть» Firebug, выберите опцию XHR и посмотрите на фактический URI, сгенерированный вашим кодом. Убедитесь, что это правильно. Если URI неверен, посмотрите на ваши маршруты и убедитесь, что этот URI будет правильно направлен на правильное действие.

Наконец-то, кроме меня, это плагин для jQuery Ajax Form . Я считаю, что это делает такие вещи очень легкими.

1 голос
/ 27 марта 2009

У вас есть два способа сделать это.

Вы можете использовать FormCollection или использовать сущность.

Образец FormCollection:

  • Контроллер

    public ActionResult ProductEditHandle(int? productID, FormCollection formCollection)
    {
        Product product = null;
    
    if (productID.HasValue)
        product = ProductEditUpdateModel(productID.Value, formCollection);
    
    return View("ProductEdit", product);
    }
    
  • View

    <% using (Html.BeginForm("ProductEditHandle", "Product", new { productID = 5 })) { %>
    ......
    <% } %>
    

Образец с сущностью:

  • Контроллер

    public ActionResult AddressTypeHandler(AddressTypeDto addressTypeDto)
    {
        var addressType = addressTypeDto.AddressTypeId > 0 ? _addressService.UpdateAddressType(addressTypeDto) : _addressService.CreateAddressType(addressTypeDto);
    
    return RedirectToAction("AddressTypeEdit", new { addressTypeId = addressType.AddressTypeId });
    }
    
  • Просмотр (Просмотр объявлен с ViewPage - AddressTypeDto)

    <% using (Html.BeginForm("AddressTypeHandler", "People")) { %>
    
    <%= Html.Hidden("AddressTypeDto.AddressTypeId", (ViewData.Model != null) ? ViewData.Model.AddressTypeId : 0) %>
    <%=Html.TextBox("AddressTypeDto.Name", ViewData.Model != null ? ViewData.Model.Name : string.Empty, new { size = 50 })%>
    <% } %>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...