【问题标题】:Ajax.BeginForm return PartialView code does not updateAjax.BeginForm 返回 PartialView 代码不更新
【发布时间】:2015-04-07 10:55:05
【问题描述】:

我正在使用 Ajax 部分执行登录注销功能。为此,我有一个 View 来检查用户是否登录并相应地显示登录或注销表单。 在提交时,它会执行 ajax 请求并登录或注销用户。在控制器中这样做后,我返回相同的局部视图。

因此,预期的行为是返回部分视图必须再次检查登录状态并相应地刷新视图,但会加载相同的表单。

局部视图:

@model Models.LoginModel


@if (Member.MemberIsLoggedOn())
{
    using (Ajax.BeginForm("LoginForm", "Account", null, new AjaxOptions
{
    HttpMethod = "POST",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "login-form-update",
},new {
    @class="loginform form"
}))
    {

    <div class="col-md-12 padding-zero">
        <div class="row flt-right">
            Hello @Context.User.Identity.Name,  <input type="submit" name="logout" class="btn btn-default" value="Log Out" />
        </div>
    </div>

    }
}
else
{

    using (Ajax.BeginForm("LoginForm", "Account", null, new AjaxOptions
{
    HttpMethod = "POST",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "login-form-update",
}, new {
    @class = "loginform form"
}))
    {

    <div class="col-md-12 padding-zero">
        <div class="row flt-right">
            <div class="form-group col-md-5">
                @Html.TextBoxFor(x => Model.Username, new { @class = "form-control", @placeholder = "Username" })
            </div>
            <div class="form-group col-md-5">
                @Html.TextBoxFor(x => Model.Password, new { @class = "form-control", @placeholder = "Password", @type = "Password" })
            </div>
            <div class="form-group col-md-2 flt-right">
                <input type="submit" name="login" class="btn btn-default" value="Go" />
            </div>
        </div>
    </div>
    }
}

控制器:

public class AccountController : Controller
    {
        [HttpPost]
        public ActionResult LoginForm(LoginModel model)
        {

            if (!ModelState.IsValid)
            {

                //Do nothing
            }

            // Login
            if (Membership.ValidateUser(model.Username, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.Username, false);
                return PartialView("Header/LoginForm", new Models.LoginModel());
            }
            else
            {
                ModelState.AddModelError("Username", "Username is not valid");
                //do nothing
            }
        }

        public ActionResult Logout()
        {

            FormsAuthentication.SignOut();
            Session.Clear();
            return PartialView("Header/LoginForm", new Models.LoginModel());
        }

    }

现在我的问题是登录/注销正常发生,但除非刷新页面,否则更改不会反映,这是我想通过 Ajax.BeginForm() 避免的,

更新 如果我点击两次,视图会发生变化,但这不是一个好的用户体验。

【问题讨论】:

  • 你设置了UpdateTargetId = "login-form-update",但是你的html中有id="login-form-update"的元素吗?
  • 是的,它在局部视图之外,我在登录和退出后尝试了两个不同的局部视图,这在一定程度上有效,但在刷新之前我仍然没有得到@Context.User.Identity.Name
  • 尝试激活Firebug,登录或退出后看看是否有错误。
  • 没有错误,响应是局部视图的html,但它不反映,在代码调试中,它也没有命中断点。
  • 可以添加Member.MemberIsLoggedOn()的代码吗?

标签: asp.net-mvc asp.net-mvc-4 asp.net-ajax partial-views


【解决方案1】:

我认为这可能是由于缓存问题。您需要使用输出缓存属性来禁用该操作方法的缓存。 你可以使用这样的东西。

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 

在返回之前还要清除你的 ModelState。

 ModelState.Clear();
 return PartialView(model); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2017-04-19
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多