【发布时间】:2016-09-07 11:33:35
【问题描述】:
在我的登录页面上,我有一个下拉列表来更改我正在为其执行 Ajax 调用以设置文化的应用程序的文化。默认情况下,我设置为“en_US”。
我的问题是,当我直接登录而不更改文化时,我能够成功登录,但是当我更改文化并尝试登录时,我无法做到这一点。这是因为 AJAX 调用导致自定义属性未注册吗?
另外,我的登录方法定义了一个自定义属性。下面是代码。
AJAX 调用
$('#ddlLanguages').change(function () {
var val = $('#ddlLanguages').val()
createCookie('culturecookie', val, 7);
$.ajax({
type: "POST",
url: '/Account/GetCultureNew',
data: { culturename: val },
success: function (result) {
$("#logo-group").html('');
$(document.body).html('');
$(document.body).html(result);
},
error: function (data) {
//alert('Error');
}
});
});
控制器中的 Ajax 方法
[HttpPost]
public ActionResult GetCultureNew(string culturename)
{
if (!string.IsNullOrEmpty(culturename) & culturename.Contains("#"))
{
string[] strdata = culturename.Split('#');
if (strdata.Length > 0)
{
AppTenant tenant = HttpContext.Session.GetObjectFromJson<AppTenant>("TenantInfo");
if (tenant != null)
{
tenant.LoggedInCulture = strdata[0];
tenant.LanguageID = Convert.ToInt32(strdata[1]);
HttpContext.Session.SetObjectAsJson("TenantInfo", tenant);
}
}
}
List<SelectListItem> items = new List<SelectListItem>();
items = HttpContext.Session.GetObjectFromJson<List<SelectListItem>>("LanguageData");
foreach (var item in items)
{
if (item.Value == culturename)
{
item.Selected = true;
}
else
{
item.Selected = false;
}
}
var itemsString = JsonConvert.SerializeObject(items);
CookieOptions obj = new CookieOptions();
obj.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Append("Languagelist", itemsString, obj);
var viewModel = new LMS_User { ReturnUrl = string.Empty, LanguageList = items };
return View("Login", viewModel);
}
登录方式
[HttpPost]
[AllowAnonymous]
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
[Route("Admin/Login/{clietname}")]
public async Task<IActionResult> Login([Bind(include: "Email,Password,RememberMe")] LMS_User model, string returnUrl)
{
// my login logic
}
编辑:- 1 登录局部视图
<div class="col-xs-12 col-sm-12 col-md-5 col-lg-4">
<div class="well no-padding">
<form action="@Url.Action("login", "account")" method="POST" id="login-form" class="smart-form client-form">
<header>
@obj["SingnIn"]
</header>
@Html.AntiForgeryToken()
<fieldset>
<section>
<label asp-for="LanguageList">@obj["LanguageList"] </label>
@Html.DropDownList("Languages", Model.LanguageList, null, new { id = "ddlLanguages", @class = "form-control" })
</section>
<section>
<label asp-for="Email">@obj["Email"]</label>
<label class="input">
<i class="icon-append fa fa-user"></i>
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
<b class="tooltip tooltip-top-right"><i class="fa fa-user txt-color-teal"></i>>@obj["tooltipEmail"]</b>
<span asp-validation-for="Email" class="text-danger"></span>
</label>
</section>
<section>
<label asp-for="Password">@obj["Password"]</label>
<label class="input">
<i class="icon-append fa fa-lock"></i>
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
<b class="tooltip tooltip-top-right"><i class="fa fa-lock txt-color-teal"></i>@obj["tooltippassword"] </b>
<span asp-validation-for="Password" class="text-danger"></span>
</label>
<div class="note">
<a href="@Url.Action("forgotpassword", "account")"><i class="fa fa-frown-o"></i> @obj["Forgot_password?"]</a>
</div>
</section>
<section>
<label class="checkbox">
<input asp-for="RememberMe" />
<i></i>@obj["Remember_Me"]
</label>
</section>
<footer>
<button type="submit" class="btn btn-primary">
@obj["SingnIn"]
</button>
</footer>
</fieldset>
</form>
</div>
@{ await Html.RenderPartialAsync("_SocialMedia"); }
编辑2:-整个登录视图
<div id="content" class="container">
<div class="row">
@{ await Html.RenderPartialAsync("_LoginText"); }
@{ await Html.RenderPartialAsync("_LoginPartial"); }
</div>
</div>
但是,如果我在 AJAX 成功功能中添加location.reload(),那么通过更改文化我可以成功登录。
对此的任何帮助表示赞赏!
【问题讨论】:
-
您好,您是不是不小心更改了防伪密钥?如果你这样做,帖子不会成功......你能提供cshtml吗?
-
@WickStargazer 我已经用登录视图代码更新了问题,鉴于我已经添加了
@Html.AntiForgeryToken(),但我没有在操作方法中使用/更改它。 -
这段代码 $(document.body).html(result);正在重置防伪密钥。如果页面没有刷新,我不确定它是否会影响帖子。在 login 属性上尝试 [ValidateInput(false)] 并查看它是否触发。更改文化后也尝试查看网络请求参数以查看发送到服务器的内容。
-
@Rohit “我做不到”是什么意思?有什么症状?
-
@Rohit 是的,这就是问题所在。视图源未更新。当你做 $(document.body).html(result);动作消失了。那是你的错误。
标签: c# ajax asp.net-mvc asp.net-core-mvc asp.net-core-1.0