这是一种利用每个结果返回的
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中挂钩的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头,并相应地做出反应。请注意,如果不是HTML,我们会“作弊”并假定为JSON。我们调用我们预先存在的addMessage()函数,无论您需要做什么!最后,这里有一个使用onclick指向上面的getPartialView()的示例Anchor元素。
<a href="#" onclick="getPartialView('Action', 'Controller', model, '#partialviewdivid', function(dvx) { connectJqueryEvents(dvx); })">Cancel</a>
非常好用...
除了通过Ajax.BeginForm()
提交表单时,由于Content-Type
验证不足而错误地将JSON负载视为HTML来处理。结果是您的
添加了一些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。