在 mvc 中使用属性路由

Working with attribute routing in mvc

在我的登录页面上,我有一个下拉列表来更改应用程序的文化,我正在为其调用 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(),那么通过改变文化我可以成功登录。

感谢任何帮助!

当您执行 $(document.body).html(result);

表单的操作部分丢失。因此它不知道post到哪里去。

希望我对您有所帮助:)