C# 部分视图验证中的Ajax表单
我在部分视图中有一个表单,它可以工作,但如果出现服务器端验证错误,它只显示部分视图。所以我决定使用ajax进行提交(实际上这很有意义,因为它插入了一个联系人,并且在主视图中有一个列表) 问题是,对于发布的代码,如果其中一个错误出现,它将正确地显示在视图中(我需要使部分再次可见,但这是另一件事),但如果没有错误,它将仅在部分视图中显示列表。我可以反过来做,在没有错误的情况下正确显示,但是没有实现验证错误的正确显示 我想了解什么是最好的方法,或者至少有哪些可能性:可能更改控制器中的代码,或者在成功回调中进行某种检查 我编辑了之前的内容,因为当没有错误时,我应该返回列表,而不是我之前发布的整个视图,但无论如何,我仍然怀疑如何区分两者,因为两者都是对post操作的成功调用C# 部分视图验证中的Ajax表单,c#,jquery,asp.net-mvc-4,C#,Jquery,Asp.net Mvc 4,我在部分视图中有一个表单,它可以工作,但如果出现服务器端验证错误,它只显示部分视图。所以我决定使用ajax进行提交(实际上这很有意义,因为它插入了一个联系人,并且在主视图中有一个列表) 问题是,对于发布的代码,如果其中一个错误出现,它将正确地显示在视图中(我需要使部分再次可见,但这是另一件事),但如果没有错误,它将仅在部分视图中显示列表。我可以反过来做,在没有错误的情况下正确显示,但是没有实现验证错误的正确显示 我想了解什么是最好的方法,或者至少有哪些可能性:可能更改控制器中的代码,或者在成功回
[HttpPost]
public ActionResult AddContact(AddContactViewModel viewModel)
{
var partyId = (int) Session["PartyId"];
if (ModelState.IsValid)
{
_contactsManager.AddContact(viewModel, partyId);
// Here I should return the updated list
}
var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
return PartialView("_AddContact", newViewModel);
}
谢谢
景色是这样的
@model ContactListViewModel
@{
ViewBag.Title = " My Contacts"
}
<div id="ContactList">
<h2>My Contacts</h2>
<hr />
<div id="addContainer">
@{ Html.RenderAction("AddContact"); }
</div>
<div id="editContainer" data-amp-url="@Url.Action("Edit", "Contacts")" class="initiallyHidden"></div>
@foreach (var group in Model.Contacts)
{
<div class="PlanContacts">
<div class="PlanName">@group.Key</div>
@foreach (var contact in group.Values)
{
<div class="Preview">
@Html.DisplayFor(m => contact, "Contact")
</div>
}
</div>
}
</div>
@section PageJavascript
{
<script src="~/Scripts/AMPContacts.js"></script>
}
以及较长的AMPContact.js中的ajax提交代码
$('#addForm').submit(function (e) {
e.preventDefault();
var addContainer = $(document.getElementById('addContainer'));
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function(result) {
addContainer.html(result);
}
});
});
我理解这个答案,这远不是一个好的答案,但也许它对缩小可能的搜索范围有帮助。由于它最终将是巨大的,我宁愿将此更新作为我自己问题的答案发布,不确定它是否符合良好的礼仪 解释性问题不是我面临的唯一问题,由于表单的重置,特别是连续的错误提交(当我再次提交错误时),我遇到了困难,所以我最终把不同问题的不同解决方案弄得一团糟。希望我能把它清理干净 谢谢 在我现在使用的视图中
<div id="myContacts">
<h2>My Contacts</h2>
<hr />
<div id="addContainer">
<div class="toggler">
Add Contact
</div>
<div id="addToggling" class="initiallyHidden">
@{ Html.RenderAction("AddContact"); }
</div>
</div>
<div id="editContainer" data-amp-url="@Url.Action("Edit", "Contacts")" class="initiallyHidden"></div>
<div id="list">
@{ Html.RenderPartial("_ContactList", Model); }
</div>
控制器与现有的行动方式略有改变,并有一个新的
public ActionResult ContactList()
{
var partyId = (int)Session["PartyId"];
var viewModel = _displayBuilder.Build(partyId);
return PartialView("_ContactList", viewModel);
}
[HttpGet]
public ActionResult AddContact()
{
var partyId = (int) Session["PartyId"];
var viewModel = _createBuilder.Build(partyId);
return PartialView("_AddContact", viewModel);
}
[HttpPost]
public ActionResult AddContact(AddContactViewModel viewModel)
{
var partyId = (int) Session["PartyId"];
if (ModelState.IsValid)
{
_contactsManager.AddContact(viewModel, partyId);
if (Request.IsAjaxRequest())
return Json(new { passedValidation = true, action = Url.Action("ContactList")});
return RedirectToAction("Index");
}
var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
return PartialView("_AddContact", newViewModel);
}
我想这看起来很有趣,我要试试这个方法
public ActionResult ContactList()
{
var partyId = (int)Session["PartyId"];
var viewModel = _displayBuilder.Build(partyId);
return PartialView("_ContactList", viewModel);
}
[HttpGet]
public ActionResult AddContact()
{
var partyId = (int) Session["PartyId"];
var viewModel = _createBuilder.Build(partyId);
return PartialView("_AddContact", viewModel);
}
[HttpPost]
public ActionResult AddContact(AddContactViewModel viewModel)
{
var partyId = (int) Session["PartyId"];
if (ModelState.IsValid)
{
_contactsManager.AddContact(viewModel, partyId);
if (Request.IsAjaxRequest())
return Json(new { passedValidation = true, action = Url.Action("ContactList")});
return RedirectToAction("Index");
}
var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
return PartialView("_AddContact", newViewModel);
}