【发布时间】:2018-02-10 02:29:08
【问题描述】:
我有一个难题。请发送帮助!
我正在构建一个 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>
这是最初由控制器中的 _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)
当在这个 _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>
接下来我希望发生什么: 当在 Notes 字段中输入文本并按下提交时,我希望将数据传递给控制器,以便将其保存到数据库并有一个新的局部视图替换页面上的 _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);
}
这是我编写的用于捕获提交事件、运行适当的控制器操作,然后将部分视图放回 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;
};
});
我的理论是我没有以某种方式用我的 js 代码捕获提交事件,而是提交操作直接进入导致问题的控制器。但是,我已确保将我的 js 脚本添加到脚本包中,该脚本包通过 _Layout 视图添加到每个视图的底部。所以说实话,我在这里大吃一惊。有人想吗?
【问题讨论】:
-
您的
$('form[data-gp-ajax=true]')不正确(需要在true周围加上引号)但如果您只使用id属性会容易得多。但由于该表单是在页面首次呈现后加载的,因此您需要使用 event delegation - 例如$(document).on('.submit', '#yourFormId', function() {... -
既然您已经使用
$.ajax()方法,我建议您摆脱Ajax.ActionLink()并使用$.ajax()方法 -
您也不会在表单上获得任何验证(添加动态内容时需要重新解析验证,并且在进行ajax调用之前需要检查
valid() -
从这个和你后续的问题中,我假设这样做的目的是编辑公司(或者只是显示公司的详细信息)并动态添加(也许还删除和编辑) 与之关联的新 CompanyNotes 对象?
标签: javascript jquery ajax asp.net-mvc asp.net-mvc-4