将表单发布到void控制器操作,之后不会重定向

时间:2015-12-13 14:32:31

标签: asp.net-mvc authorization

这是我发布表单的观点:

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { id="frmRegister", @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="col-md-8">
        @Html.TextBoxFor(x => x.Username, new { @class = "form-control form-input", placeholder = "ID" })
        @Html.ValidationMessageFor(m => m.Username, "", new { @class = "text-danger" })
    </div>
    <div class="col-md-8">
        @Html.TextBoxFor(x => x.Mail, new { @class = "form-control form-input", placeholder = "Mail" })
        @Html.ValidationMessageFor(m => m.Mail, "", new { @class = "text-danger" })
    </div>
    <div class="col-md-8">
        @Html.PasswordFor(x => x.Password, new { @class = "form-control form-input", placeholder = "Parolă" })
        @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
    </div>
    <div class="col-md-8">
        @Html.PasswordFor(x => x.ConfirmPassword, new { @class = "form-control form-input", placeholder = "Confirmă parola" })
        @Html.ValidationMessageFor(m => m.ConfirmPassword, "", new { @class = "text-danger" })
    </div>
    <input type="submit" id="btnGetConfCodeView" onclick="ShowConfCodeInput()" style="margin-top: 7px; margin-bottom: -5px" value="Fă-l!" class="btn btn-info" />
    <input type="button" id="btnCloseRegister" style="margin-top: 7px; margin-bottom: -5px" value="Las'" class="btn btn-default" />
}

我正在使用该操作存储输入的数据:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public void Register(RegisterViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            var user = new User
            {
                Username = viewModel.Username,
                Mail = viewModel.Mail,
                Password = viewModel.Password,
                MemberSince = DateTime.Now
            };
            Session["currentUser"] = user;
        }
    }

执行此操作后,我将重定向到 / Account / Register 路径。我希望这不会发生,是否可能?

3 个答案:

答案 0 :(得分:1)

它将显示空白屏幕,其中包含网址Account/Register,因为您从HttpPost操作方法返回无效。

理想情况下,您应该使用PRG模式。

POST - REDIRECT-GET

  1. 显示表单,要求用户输入一些内容。
  2. 当用户提交表单时,代码会执行一些业务逻辑/事务(将某些内容保存到db等)。成功完成后,向浏览器发送302响应。
  3. 302响应告诉浏览器向服务器提供的url发出全新的GET请求。在MVC中,我们可以使用RedirectToAction方法将302响应发送到浏览器。 / LI>

    所以你的代码将是

    [HttpPost]
    public void Register(RegisterViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
           // to do  :Save 
          return RedirectToAction("SuccesfullyRegistered","Account");
        }
        return View(viewModel);
    }
    

    因此,当用户提交表单时,我们将保存用户并向浏览器发送302响应,浏览器将向Account/SuccessfullyRegistered操作方法发出请求。

    当用户重新加载新视图时,PRG模式可防止重复表单提交问题。

答案 1 :(得分:0)

根据您的评论,您应该使用Ajax Helper或jquery通过ajax提交表单。 Working with Ajax Helper in ASP.NET MVC是使用Ajax Helper的一个很好的教程,在stackoverflow中有很多关于使用jquery提交表单的问题。由你来雇用其中一个。似乎Ajax Helper更容易使用。

答案 2 :(得分:0)

如果您确实要触发并忘记提交表单的POST请求,则可以添加一个不可见的 iframe ,并使表单的 target 属性指向该iframe。然后,对POST的回复的内容将放在那里,并且由于iframe被隐藏,用户将看不到它。

您的iframe定义如下:

<iframe id="nulframe" name="nulframe" style="width:0;height:0;border:0; border:none;" />

,您可以将target属性添加到代码的第一行,如下所示:

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { id="frmRegister", @class = "form-horizontal", role = "form", target = "nulframe" }))

您甚至可以处理iframe的 load 事件,以便在POST完成后得到通知。