MVC2: Как отправлять данные из частичного просмотра на его контроллер?

#asp.net #asp.net-mvc #asp.net-mvc-2

#asp.net #asp.net-mvc #asp.net-mvc-2

Вопрос:

У меня есть эта модель:

 public class Package
{
    public string CustomerName { get; set; }
    public List<Product> Products { get; set; }
    public int Id { get; set; }
}

public class Product
{
    public int Quantity { get; set; }
    public string Name { get; set; }
    public int Id { get; set; }
}
  

У меня есть представление Create для создания нового пакета и одно или несколько PartialView для создания продукта.

Как я могу отправить информацию о продукте на контроллер продукта, не выходя из представления?

Вот код Partialview моего продукта:

 <% using (Ajax.BeginForm("Create", "Product", new AjaxOptions())) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Name) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Name) %>
            <%: Html.ValidationMessageFor(model => model.Name) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Quantity) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Quantity) %>
            <%: Html.ValidationMessageFor(model => model.Quantity) %>
        </div>

<%--    <p>
            <input type="submit" value="Create" />
        </p>--%>
    </fieldset>

<% } %>
  

Спасибо

Комментарии:

1. @SLaks, да, я знаю, но какой вызов выполнить? Как передать данные полей на контроллер?

2. С формой, которую вы получили выше, вам просто нужно раскомментировать кнопку отправки и <script src=»@Url.Content(«~/Scripts/jquery.unobtrusive-ajax.min.js «)» введите=»text / javascript»></script> вверху. Вам вообще не нужно будет писать какой-либо код javascript, если вы это сделаете

3. Эта форма (Product Form) находится в другой форме (Package form), и даже если я использую этот скрипт, вызывается Create of Package, а не Product form. Я думаю, что я должен использовать метод $.post.

Ответ №1:

Вы можете использовать AJAX для решения вашей проблемы. Приведенный ниже код отправляет 3 значения в YourController в YourAction.

 jQuery('#YourButton').click(function (event) {

    var jqxhr = $.post("YourController/YourAction", {
        lastName: $("#tbLastName").val(),
        firstName: $("#tbFirstName").val(),
        id: $("#id").val()
    },
    function (data) {
        $('#WhereResultAppear').html(data); //can be deleted
    })

    .success(function () {
        $('#InCaseOfSuccess').html(data); //can be deleted
    })

    .error(function (jqXHR, status, error) {
        $('#InCaseOfError').html(data); //can be deleted
    })

    .complete(function () {
        $('#WhenActionIsComplete').html(data); //can be deleted
    });
});
  

Комментарии:

1. Да, я буду использовать $.post (). Спасибо

Ответ №2:

Дайте идентификатор вашей форме в частичном представлении. а затем использовать jQuery для отправки данных путем сериализации формы.

 $.post("controller/action", $("#formId").serialize(),
   function(data) {
     alert("Data Loaded: "   data);
   });
  

И в контроллере

    Package pakage = new Package();

    UpdateModel(pakage );
  

Комментарии:

1. Я загружаю частичное представление с помощью метода load jQuery, и когда я это делаю, частичное представление отображается, но форма частичного представления — нет!

2. Я обновил ответ, чтобы предоставить вам код частичного просмотра

Ответ №3:

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

 @using (Ajax.BeginForm("ActionOnController", new AjaxOptions{}))
{

}
  

Это сделает все это за вас (при условии, что вы включите необходимый javascript, например jquery.unobtrusive-ajax.min.js )

Взгляните на документацию по AjaxOptions. Это позволяет вам (среди прочего) обновить другой раздел после обратной публикации значений. Вы можете использовать это, чтобы указать на успех

Мартин