我一直在寻找一种使用模式弹出窗口更新数据的方法。 现在我正在使用 devexpress,因为我们已经在使用其他 devexpress 控件(但如果 jquery 库更容易,这可能会改变!!)
我坚持验证方面。坦率地说,对于我想要实现的目标,整个过程似乎相当困难。
无论如何,让我描述一下我目前制定的过程:
-索引页面包含可以更新的不同元素的概述。使用 HtmlExtension,我能够创建一个 devexpress 弹出窗口,它会在您打开弹出窗口时加载编辑页面。=> @Html.PopupControl().WithText("Edit").PopupGoesTo(Url.Action("EditPopup"等)
- 编辑页面 - 只是部分视图 - 工作得很好。我创建了一个小测试页面,其中包含 1 个文本框,它采用十进制。
我想使用 ajax 提交表单(因为坦率地说,如果我做一个完整的回帖,我不知道如何显示验证,因为我需要能够创建弹出窗口并将数据绑定到它并触发验证错误)。
<script type="text/javascript">
function EndPopUpUpdate(message) {
if (message.url) {
window.locatin.href = url;
}
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
function BeginPopUpUpdate() {
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
</script>
using (Ajax.BeginForm("Edit", "xxx", new AjaxOptions { UpdateTargetId = "PopUpDiv", HttpMethod = "Post", OnBegin = "BeginPopUpUpdate", OnComplete = "EndPopUpUpdate"}, new { id = "PopUpForm" }))
{
<div id="PopUpDiv">
@Html.Partial("EditPopup", new xxxViewModel())
</div>
}
当我通过手动重新挂钩 jquery 事件回发时,我能够实现验证(因为这些事件不会被挂钩,因为页面是动态加载的)
function ReconnectValidation() {
$("#PopUpForm").ready(function () {
$.validator.unobtrusive.parse("#PopUpForm");
});
$("#submitButton").click(function (e) {
var form = $("#PopUpForm");
if (!form.valid()) {
e.preventDefault();
}
});
}
所以这处理了我的客户端验证,这很有效。
现在,我的实际问题!服务器端验证。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([ModelBinder(typeof(CommandModelBinder))] UpdateCommand command)
{
if (!ModelState.IsValid)
{
//using the command pattern
var handlerResult = HandlerLocator.GetQueryHandler<IGetOverviewHandler>().Execute(..);
return PartialView("EditPopUp", handlerResult.ViewModel);
}
HandlerLocator.GetCommandHandler<UpdateCommand>().Handle(command);
var returnLink = Url.Action("Index", new {..});
return Json(new { url = returnLink }, JsonRequestBehavior.AllowGet);
}
我编写了一个 CustomModelBinder,它只在我的命令对象(如果你愿意的话,我的返回模型)中查找属性,并在 formcollection 中查找是否可以找到具有相同名称的匹配对象。然后它会尝试转换它,如果失败,它会将 ModelError 绑定到我的 ModelState。
所以,现在我们有一个有效或无效的 ModelState。如果它有效,我想重定向到索引(这样我的概述可以更新)。我读过我应该在客户端处理这个问题,因为 ajax.BeginForm 将用结果替换“PopUpDiv”-div(它只是在我的页面中创建相同的页面)。
这是 onComplete 事件:
function EndPopUpUpdate(message) {
if (message.url) {
window.locatin.href = url;
}
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
问题是,我没有收到 json 消息,但收到了 PartialView。这意味着我无法访问 message.url..因为这不是我收到的:/
所以这是问题1
如果对象无效,我想返回带有模型的部分视图并向用户提供错误。当我返回部分视图时,它只是替换当前视图,但不显示任何验证错误..
那是第2个问题:)
此外,如果您知道解决此问题的更好方法,请不要犹豫做出回应(因为这种方法看起来确实令人费解-或应该做-)
很抱歉这篇冗长的帖子,但我希望一切都清楚。
感谢您的帮助和时间!