通过Ajax提交部分视图表单以返回部分视图

Nic*_*ers 5 javascript ajax asp.net-mvc jquery asp.net-mvc-4

我有两难选择。请发送帮助!

我正在构建MVC 4 Web应用程序,并且在加载来自另一个局部视图的表单时无法将局部视图加载到页面的一部分上。到目前为止,这是我所做的:

在基础页面(ReviewPage)上,我有一个部分,该部分在加载页面时加载部分视图。像这样:

@model AppV4.Models.NewCompanyRequest

@{
    ViewBag.Title = "ReviewNewRequest";
}

<h2>New Sign Up Review</h2>


<div class="container">
    <div class="row">
        <div class="col-lg-8 col-md-8">
            <div id="company_notes">
                 @Html.Action("_CompanyNotes")
            </div>
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是控制器中的_CompanyNotes操作最初加载的局部视图(_NoNotes):

@model AppV4.Models.ViewModels.NotesOnCompanyViewModel

<h4>Notes on Company</h4>

<div class="row text-center col-sm-6 col-sm-offset-6">
    <div class="text-center">
        <div class="primary-action-bttn-border">
            <div class="primary-action-bttn-bkg">
                @Ajax.ActionLink("Add Note", "_CompanyNotesEditGet", Model, new AjaxOptions { UpdateTargetId = "company_notes", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { @class = "btn btn-default primary-action-bttn" })
            </div>
        </div>
    </div>
</div>

<div class="row text-center padding-25-top">
    <p>There are no notes for this company.  Do you want to add some?</p>
</div>
 @Html.HiddenFor(item => Model.RequestId)
Run Code Online (Sandbox Code Playgroud)

在此_NoNotes局部视图中单击“添加注释”按钮时,控制器中的_CompanyNotesEditGet操作将返回局部视图(_NotesForm),该局部视图将替换#company_notes div中页面上的_NoNotes。这可以正常工作。这是_NotesForm部分视图:

@model AppV4.Models.ViewModels.NotesOnCompanyViewModel

<form data-gp-ajax="true" action="@Url.Action("_CompanyNotesEditPost", "NewSignUpRequestReview")" method="post" data-gp-target="#company-notes">
    <div class="form-horizontal">
        <h4>Notes On Company</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.NotesId)
        @Html.HiddenFor(model => model.CompanyId)

        <div class="form-group">

            @Html.LabelFor(model => model.Notes, htmlAttributes: new { @class = "control-label col-md-2 text-left" })
            <div class="col-md-12">
                @Html.EditorFor(model => model.Notes, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Notes, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

接下来 ,我会发生什么:当在Notes字段中输入文本并按下Submit时,我希望将数据传递到控制器,以便可以将其保存到数据库并使用新的局部视图替换_NotesForm部分在页面上。

当前发生的情况: 当在“备注”字段中输入文本并按下“提交”时,控制器将接收数据并开始工作。但是,它取代了整个提交的页面,而不是部分视图替换了刚提交的表单。从字面上看,整个页面都替换为该部分视图的内容。

我尝试使用在这里和其他地方找到的各种表单提交技术,但是似乎没有任何方法可以按照我的意愿进行。

这是应该返回部分视图_CompanyNotes的控制器操作:

[HttpPost]
public ActionResult _CompanyNotesEditPost(NotesOnCompanyViewModel notesOnCompanyViewModel)
{
    //code that reviews the notes and places it into the db//

    return PartialView("~/Views/NotesOnCompany/_CompanyNotes.cshtml", notesOnCompanyViewModel);
}
Run Code Online (Sandbox Code Playgroud)

这是我编写的用于捕获Submit事件,运行适当的控制器操作,然后将部分视图放回到ReviewPage上的JavaScript:

$(function () {
    $('form[data-gp-ajax=true]').submit(function () {

        var $form = $(this);

        $.ajax({
            url: $form.attr("action"),
            type: $form.attr("method"),
            data: $form.serialize(),
            success: function (viewHTML) {
                $("#company_notes").show();
                $("#company_notes").html(viewHTML);
            };
        })

        return false;
    };
});
Run Code Online (Sandbox Code Playgroud)

我的理论是我不会以某种方式捕获我的js代码中的Submit事件,而是,Submit操作直接进入我的控制器,这导致了问题。但是,我已经确保将我的js脚本添加到脚本包,该脚本包通过_Layout视图添加到每个视图的底部。所以我老实在这里感到惊讶。有人在想吗?

Nic*_*ers 1

我尝试了事件传播方法,但仍然得到相同的结果。提交不是由 js 捕获事件,而是直接发送到控制器并使用部分视图刷新整个页面。

id="edit-company-notes"在部分视图_NotesForm 上添加了表单标签。

并编写了以下我为事件传播编写的js:

$('div#company_notes').on('.submit', '#edit-company-notes', function () {

        var $form = $(this);

        $.ajax({
            url: $form.attr("action"),
            type: $form.attr("method"),
            data: $form.serialize(),
            success: function (viewHTML) {
                $("#company_notes").show();
                $("#company_notes").html(viewHTML);
            }
        });

        return false;
    });
Run Code Online (Sandbox Code Playgroud)

尽管使用'.submit'而不是完全搞砸了'submit'!那一段导致整个事情被跳过!

这是事件处理程序的正确 js:

$('div#company_notes').on('submit', '#edit-company-notes', function () {

    var $form = $(this);

    $.ajax({
        url: $form.attr("action"),
        type: $form.attr("method"),
        data: $form.serialize(),
        success: function (viewHTML) {
            $("#company_notes").show();
            $("#company_notes").html(viewHTML);
            }
    });

    return false;
});
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助其他像我昨晚一样用头撞墙的人!