我有一个包含viewmodel的页面,在页面上单击按钮提交ajax表单:
@using (Ajax.BeginForm("finalstatus", "User", null, new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "popupappear()",
}, new { id = "progForm"}))
{
@Html.HiddenFor(Model => Model.SectionID)
@Html.HiddenFor(Model => Model.CourseID)
}
这使用控制器操作:
[HttpPost]
public ActionResult finalstatus(SubSectionViewModel model)
{
string currentuser = User.Identity.GetUserId();
var viewModel = db.enrollment
.Where(i => i.UserID == currentuser)
.Where(i => i.course.CourseID == model.CourseID)
.Select(x => new CurrentProgressViewModel
{
ovpcnt = (int)Math.Round((double)(100 * x.progress.Sum(c => c.progress)) / x.course.course_sections.SelectMany(i => i.course_subsections).Sum(c => c.scenes)),
}).Single();
return PartialView("_endofsection", viewModel);
}
这应该计算用户的进度百分比并在部分视图中返回该百分比" _endofsection"到页面。局部视图使用保持百分比的CurrentProgressViewModel。
一切似乎都有效,但部分视图似乎没有加载到页面上,我可以看到它正在谷歌浏览器的网络选项卡中正确访问和预览。但是它不会出现在表单所在的页面上,这是我希望加载部分视图的地方。
我在这里缺少什么?为什么这不出现?
此外,表单成功提交时调用的onsuccess函数似乎仅在第二次单击时调用,但这是次要问题。
答案 0 :(得分:1)
您正在使用Ajax.BeginForm
辅助方法进行ajax调用。因此,您需要指定在DOM中替换(ajax调用)的响应。您可以使用UpdateTargetId
属性指定该属性。它应该是您想要添加从ajax调用返回的响应的元素的ID。
您还需要提交按钮才能提交表单。
这应该可以正常运行,假设您的操作方法正确返回部分视图结果而没有任何错误。
<div id="YourDivToShowResult"></div>
@using (Ajax.BeginForm("finalstatus", "User", null, new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "popupappear()",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "YourDivToShowResult"
}, new { id = "progForm" }))
{
@Html.HiddenFor(Model => Model.SectionID)
@Html.HiddenFor(Model => Model.CourseID)
<input type="submit"/>
}