这是一种利用每个相应结果返回的Content-Type 的方法。我们使用它来发回错误信息,并且已经有 JS 来显示消息,所以我们得到了我们想要的部分视图,或者错误报告的控制信息等。
作为参考,部分视图返回text/html,JSON 响应应返回application/json。
像往常一样,有趣的部分在 javascript 方面,而 JQuery ajax() 在这里不会让人失望!
在您的控制器中,根据需要返回PartialView() 或Json(model,);我们以try/catch 格式使用它。
public ActionResult Edit(int id) {
try {
var model = getYourModel();
return PartialView("Edit", model);
}
catch (Exception ex) {
var mi = new MessageInfo(MessageType.Error, String.Format("Edit failed: {0}", ex.Message), true);
return Json(mi, "application/json", JsonRequestBehavior.AllowGet);
}
}
在 JS 端,我们使用以下函数。请注意,您需要从初始页面级 GET 重新建立您在 $(document).ready() 中挂钩的任何 JQuery 事件,因此我们有一个回调参数。
function getPartialView(action, controller, model, divId, callback) {
var url = "/" + controller + "/" + action + "/";
$.ajax({
type: "GET",
url: url,
data: model,
success: function (data, textStatus, jqXHR) {
var ct = jqXHR.getResponseHeader("Content-Type");
var mx = ct.match("text\/html");
if (mx != null) {
$(divId).html(data);
if (callback) {
callback($(divId));
}
}
else {
addMessage(data.type, data.title, data.text, data.sticky);
}
},
error: function (jqXHR, textStatus, errorThrown) {
addMessage(3, "\"" + url + "\": Failed", textStatus + ": " + errorThrown, false);
}
});
}
唯一棘手的一点是检查响应中的Content-Type 标头,并采取相应的行为。请注意,如果 JSON 不是 HTML,我们就是在“作弊”。我们正在调用我们预先存在的addMessage() 函数,随心所欲!
最后,这是一个示例 Anchor 元素,上面有 onclick 以 getPartialView() 为目标。
<a href="#" onclick="getPartialView('Action', 'Controller', model, '#partialviewdivid', function(dvx) { connectJqueryEvents(dvx); })">Cancel</a>
效果很好...
除了通过Ajax.BeginForm() 提交的表单,由于Content-Type 的验证不足,JSON 有效负载被错误地视为 HTML。结果是您的div 添加了一些 JSON,它基本上不会呈现为 HTML。 AjaxOptions.OnSuccess 回调确实会执行,但此时对于您的 DOM 来说为时已晚!
有一个简单的解决方案,但不幸的是,它需要对jquery-unobtrusive-ajax.js 进行小修复,因为asyncOnSuccess() 函数在编写时是短视的。
function asyncOnSuccess(element, data, contentType) {
var mode;
if (contentType.indexOf("application/x-javascript") !== -1) {
return;
}
if (contentType.indexOf("application/json") !== -1) {
return;
}
...snip...
}
在 OOTB 版本中,缺少第二个 if 语句;添加它是防止它将您的 JSON 有效负载猛烈撞击到 DOM 的必要修复。
通过此修复,JSON 有效负载将传递到您的 AjaxOptions.OnSuccess Javascript,您可以根据需要继续操作。
是的,你可以两者兼得
希望您知道,既然您要发送 Json,您可以发送回任何类型的模型,并让 Javascript 对其进行排序; hasOwnProperty() 在那里派上用场。所以很明显你可以通过已经提到的RenderViewToString()发回一些视图HTML。