在通過Ajax查詢加載它的最簡單的事情的一部分嘗試使用RenderPartialViewToString,並使用該字符串設置html選項卡。 :
控制器
[HttpGet]
public JsonResult GetTab()
{
var msg = String.Empty;
bool isValid = false;
var view = String.Empty;
try
{
var model = new Artist();
model.Name = "Name";
model.Band = "Band";
view = RenderPartialViewToString("_ArtistDetail", model);
isValid = true;
}
catch (Exception ex)
{
msg = String.Format("{0}: {1}", DateTime.Now.ToShortTimeString(), ex.Message);
//or view = "Error" view
}
var result = new { isValid = isValid, view = view, msg = msg };
return Json(result, JsonRequestBehavior.AllowGet);
}
//Magic here!
protected string RenderPartialViewToString(string viewName, object model = null)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
管窺_ArtistDetail.cshtml
@model WebApplication1.Models.Artist
<h1>@Model.Name</h1>
<h3>@Model.Band</h3>
HTML
<ul class="nav nav-tabs" role="tablist">
<li class="active"><a tabindex="0" target="_self" href="#edit" role="tab" data-toggle="tab">Edit</a></li>
<li id="overviewTab"><a tabindex="0" target="_self" href="#overview" role="tab" data-toggle="tab">Account Overview</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="edit">
// -- stuff
</div>
<div class="tab-pane" id="overview">
<div id="myTab" class="row">
Loading...
</div>
</div>
</div>
JS
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href");
if (target == "#overview" && !overviewLoaded) {
GetTab();
overviewLoaded = true;
};
});
var GetTab = function() {
var div = $("#myTab");
div.empty();
div.append("Loading...");
$.ajax({
url: "/GetTab",
type: 'GET',
dataType: 'json',
processData: false,
contentType: 'application/json; charset=utf-8',
success: function (data) {
div.empty();
if (data.isValid) {
div.append(data.view);
} else {
div.append(data.msg);
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error");
}
});
};
檢查RenderPartialViewToString,並用該字符串設置html選項卡。 – Mate