【发布时间】:2018-10-31 04:17:45
【问题描述】:
在我的主布局中,我尝试通过 ajax 添加登录部分视图,但是我不断收到“内部服务器错误”。我已经尝试了各种其他发布的解决方案,但没有运气
一切都很标准我有我的 HomeController 和 index.cshtml(它使用 layout.cshtml)
在布局中,一旦文档准备好,我使用ajax查看用户是否通过HomeController登录,如果返回值为false我想显示部分视图。
函数 showLoginPartial 尝试通过 ajax 从 LoginController 获取部分视图失败
“showLoginPartial() 中的错误:内部服务器错误:-: 错误”
我做错了什么?
HomeController 方法:
public JsonResult IsUserLoggedIn()
{
return Json(new { result = (CurrentUser != null) }, JsonRequestBehavior.AllowGet);
}
布局jquery:
$(document).ready(function () {
checkLoggedIn();
function checkLoggedIn() {
$.ajax({
url: '@Url.Action("IsUserLoggedIn", "Home", new { })',
success: function (data) {
if (data.result == false) {
//Show the login partial view
showLoginPartial();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Error in checkLoggedIn(): " + errorThrown + " :-: " + textStatus);
}
});
}
function showLoginPartial() {
$.ajax({
url: '@Url.Action("LoginDisplay", "Login", new { })',
success: function (response) {
//add the partial view after #ib-container div
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
//Error displays
alert("Error in showLoginPartial(): " + errorThrown + " :-: " + textStatus);
}
});
}
})
登录控制器:
public class LoginController : Controller
{
// GET: Login
[ChildActionOnly]
public ActionResult LoginDisplay()
{
return PartialView("_LoginDisplay");
}
public JsonResult UserLoggedOut()
{
return Json(new { result = Nuclei.Models.CurrentUserAccount.Instance.LoggedOut }, JsonRequestBehavior.AllowGet);
}
public JsonResult UserAutoAuthenticate()
{
bool l_result = false;
System.Threading.Thread.Sleep(3000);
return Json(new { result = l_result }, JsonRequestBehavior.AllowGet);
}
public JsonResult UserManualAuthenticate()
{
bool l_result = false;
System.Threading.Thread.Sleep(3000);
return Json(new { result = l_result }, JsonRequestBehavior.AllowGet);
}
public JsonResult SendUserCredentials()
{
bool l_result = true;
System.Threading.Thread.Sleep(3000);
return Json(new { result = l_result }, JsonRequestBehavior.AllowGet);
}
}
[编辑]
刚刚尝试通过 RenderAction() 添加局部视图,它工作了,但这不是我想要的,肯定想使用 ajax。
@{ Html.RenderAction("LoginDisplay", "Login"); }
将其余方法也添加到上面的 LoginController 中
_LoginDisplay.cshtml
<div id="login_layer_overlay">
</div>
<div id="login_layer">
<div id="MainLoginDiv">
<div id="LoginHeaderDiv" class="text-center">
<h3 id="LoginHeader" class="page-header" style="color:white;"> </h3>
</div>
<div id="Spinner" class="spinner">
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
<i><b></b></i><!--1--><i><b></b></i><!--2--><i><b></b></i><!--3--><i><b></b></i><!--4--><i><b></b></i><!--5--><i><b></b></i><!--6--><i><b></b></i><!--7--><i><b></b></i><!--8--><i><b></b></i><!--9--><i><b></b></i><!--10-->
</div>
<div id="ManualLogin" class="box" style="border: none;">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
<label class="control-label" style="color:white;">Username</label>
@Html.TextBox("username", null, new { id = "username", @class = "form-control", @Value="us" })
</div>
<div class="form-group">
<label class="control-label" style="color:white;">Password</label>
@Html.TextBox("password", null, new { id = "password", @class = "form-control", @Value = "pwd" })
</div>
<div class="text-center" style="margin-top:40px;">
<input type="button" id="ManualLoginBtn" value="Sign in" class="btn btn-primary" />
<br />
<input type="button" id="AutoLoginBtn" value="Auto Authenticate" class="btn btn-default" />
<input type="button" id="ForgotLoginBtn" value="Forgot Credentials" class="btn btn-default" />
</div>
}
</div>
<div id="ForgotLogin" class="box" style="border: none;">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
<label class="control-label" style="color:white;">Email</label>
@Html.TextBox("email", null, new { id = "email", @class = "form-control", @Value = "jhjhblah" })
</div>
<div class="text-center" style="margin-top:40px;">
<input type="button" id="BackToLoginBtn" value="Back" class="btn btn-default" />
<input type="button" id="ForgotSubmitBtn" value="Submit" class="btn btn-primary" />
</div>
}
</div>
</div>
</div>
<script>
$(document).ready(function () {
var spinnerItems = $("#Spinner i b");
$("#MainLoginDiv").css("opacity", "1");
checkUserLoggedOut();
function checkUserLoggedOut() {
$.ajax({
//First need to check for logged off
url: '@Url.Action("UserLoggedOut", "Login", new { })',
success: function (data) {
if (data.result == false) {
showAutoAuthenticate();
}
else {
showManualForm();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Error: " + errorThrown + " :-: " + textStatus);
}
});
}
function showAutoAuthenticate() {
$("#LoginHeader").text("Auto Authenticating");
$("#ManualLogin").css("opacity", "0");
setTimeout(function () { $("#ManualLogin").css("display", "none"); }, 550);
$("#Spinner").css("opacity", "1");
spinnerItems.each(function () {
$(this).addClass("spinAnimation");
})
$.ajax({
url: '@Url.Action("UserAutoAuthenticate", "Login", new { })',
success: function (data) {
if (data.result == false) {
//Switch to manual
//showForgotLogin();
showManualForm();
}
else {
//Remove login
$("#AutoLogin").css("opacity", "0");
spinnerItems.each(function () {
$(this).removeClass("spinAnimation");
})
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Error in showAutoAuthenticate(): " + errorThrown + " :-: " + textStatus);
}
});
}
function showManualAuthenticate() {
$("#LoginHeader").text("Authenticating");
$("#ManualLogin").css("opacity", "0");
setTimeout(function () { $("#ManualLogin").css("display", "none"); }, 550);
$("#Spinner").css("opacity", "1");
spinnerItems.each(function () {
$(this).addClass("spinAnimation");
})
$.ajax({
url: '@Url.Action("UserManualAuthenticate", "Login", new { })',
success: function (data) {
if (data.result == false) {
//Switch to manual
//showForgotLogin();
showManualForm();
}
else {
//Remove login
$("#AutoLogin").css("opacity", "0");
spinnerItems.each(function () {
$(this).removeClass("spinAnimation");
})
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Error in showManualAuthenticate(): " + errorThrown + " :-: " + textStatus);
}
});
}
function showForgottenProcessing() {
$("#ForgotLogin").css("opacity", "0");
setTimeout(function () { $("#ForgotLogin").css("display", "none"); }, 550);
$("#Spinner").css("opacity", "1");
spinnerItems.each(function () {
$(this).addClass("spinAnimation");
})
$.ajax({
url: '@Url.Action("SendUserCredentials", "Login", new { })',
success: function (data) {
if (data.result == false) {
//Switch to manual
showForgotLoginForm();
}
else {
//Go back to login
showManualForm();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Error in showManualAuthenticate(): " + errorThrown + " :-: " + textStatus);
}
});
}
function showManualForm() {
$("#Spinner").css("opacity", "0");
spinnerItems.each(function () {
$(this).removeClass("spinAnimation");
})
$("#ForgotLogin").css("opacity", "0");
setTimeout(function () { $("#ForgotLogin").css("display", "none"); }, 550);
$("#LoginHeader").text("Login");
$("#ManualLogin").css("display", "block");
$("#ManualLogin").css("opacity", "1");
}
function showForgotLoginForm() {
$("#Spinner").css("opacity", "0");
spinnerItems.each(function () {
$(this).removeClass("spinAnimation");
})
$("#ManualLogin").css("opacity", "0");
setTimeout(function () { $("#ManualLogin").css("display", "none"); }, 550);
$("#LoginHeader").text("Retrieve Credentials");
$("#ForgotLogin").css("display", "block");
$("#ForgotLogin").css("opacity", "1");
}
$("#AutoLoginBtn").click(function () {
showAutoAuthenticate();
});
$("#ForgotLoginBtn").click(function () {
showForgotLoginForm();
});
$("#BackToLoginBtn").click(function () {
showManualForm();
});
$("#ManualLoginBtn").click(function () {
showManualAuthenticate();
});
$("#ForgotSubmitBtn").click(function () {
showForgottenProcessing();
});
})
</script>
【问题讨论】:
-
Internal Server Error表示局部视图中的某处抛出未处理的异常。你能提供_LoginDisplay.cshtml的内容吗?还可以尝试剥离[ChildActionOnly]属性。 -
剥离了 [ChildActionOnly],似乎可以解决问题,它没有显示错误,我已经能够添加视图。谢谢你。有趣的是,当我使用 @{ Html.RenderAction("LoginDisplay", "Login");它需要 [ChildActionOnly] 属性。如果您将此添加为答案,我会接受。
标签: c# jquery ajax asp.net-mvc partial-views