这当然不是一个新手问题,我已经在网上上下梳理了这个问题的答案,到目前为止,我发现的最好的解决方案有点隐藏在本教程中here http://www.weirdlover.com/2010/05/14/mvc-render-partial-modal-pop-up-via-jquery-and-colorbox-part-1/。这就是达林·迪米特洛夫 (Darin Dimitrov) 在阿贾克斯更新中所建议的。我将总结该链接的重要部分以及为什么这不容易修复:/
基于奇怪情人的Ajax刷新
ajax刷新的解决方案很大程度上取决于以下功能(奇怪的爱好者使用ControllerContext,但它对我来说不存在,所以我有控制器扩展):
ControllerExtension.RenderPartialViewToString(this,"mypartial", (object)model)
该函数采用模型+模型状态并将部分视图重新呈现为 html 字符串。然后,您可以获取该字符串并将其以 json 对象形式发送回某些 javascript 以刷新视图。我用了jquery,它看起来像这样,
$(document).ready(function () {
var partialViewUpdate = function (e) {
e.preventDefault(); //no postback
var partialDiv = $(this).parent(".partial");
$.post($(this).attr("action"),
$(this).serialize(),
function (json) {
if (json.StatusCode != 0) {
// invalid model, return partial
partialDiv.replaceWith(json.Content);
}
else if (json.Content != null && json.Content != "") {
window.location.replace(data.Content);
};
});
$(".partial").find("form")
.unbind('submit')
.live("submit", partialViewUpdate);
};
jquery解释:
- 查找包含我的部分 (class="partial") 的 div 并找到该 div 中的表单
- 使用该表单取消绑定任何其他“提交”事件(在取消绑定之前,我遇到了一些奇怪的双重提交错误)。
- 使用“live”,以便一旦内容被替换,它就会再次重新绑定
- 一旦我们进入函数partialViewUpdate...
- 阻止表单完成提交,以便全部由ajax处理。
- 获取包含我的部分内容的 div(稍后将使用它)
- 通过从表单 $(this).attr("action") 获取来设置 jquery post url
- 采取形式(即我们的模型)并将其序列化为控制器函数 $(this).serialize()
- 创建将处理 ajax 返回值的函数。
- 我使用我自己的个人 json 对象,其中 StatusCode 1 是错误的。因此,如果它很糟糕,那么我会采用 Content 中的内容,这就是字符串渲染部分视图到字符串给了我,我只是替换了包含我的部分的 div 的内容。
为什么它不能正常“工作”
因此,部分视图不仅仅适用于模型状态验证的原因是,您无法使用 POST 返回 View(model),因为 MVC 会将其解析为部分视图 (login.ascx) 的路由地址,而不是部分嵌入(index.aspx)。
您也不能使用 RedirectAction(),因为这会将其发送到 (index.aspx) 控制器函数,这相当于清除所有内容并刷新 index.aspx 页面。但是,如果您使用 Chino 和 Thabaza 建议的 ActionFilter,那么当刷新页面并且再次触发 login.ascx 控制器功能时,它将获取该临时数据。然而,如果刷新页面导致客户端代码(例如弹出模式)出现麻烦(即,如果刷新弹出窗口就消失了),则此方法不起作用。
说不是这样
我希望它“刚刚起作用”,所以如果有人知道正确/更好的方法,请分享它!我仍然觉得 Ajax 刷新和 ActionFilter 解决方案不是一种干净的方法,因为它几乎使它看起来像带有表单的部分视图,如果没有某种“技巧”就不可能使用。