【问题标题】:Working with attribute routing in mvc在 mvc 中使用属性路由
【发布时间】: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


【解决方案1】:

当你做$(document.body).html(result);

表单的操作部分丢失。因此它不知道在哪里发布。

希望对我有所帮助:)

【讨论】:

  • 那么,如何使用所选语言更新表单控件的文本?
  • 尝试调试为什么视图没有呈现动作。检查网络请求返回的内容。为了快速修复,我建议您在表单中使用带有容器 div 的局部视图。
  • 我的登录视图已经有2个部分,请看我的编辑2,其中_LoginPartial需要一个模型
  • 建议不要重新渲染Form元素并返回。但是我从来没有任何问题。更改语言后能否转储您的 ajax 响应?
  • 我正在分享我已经转储 ajax 响应的链接,因为它有点冗长,drive.google.com/file/d/0B3r_zMG9Y-HJSV9vbjVIb2xlaG8/…
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 2014-09-07
  • 2016-11-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多