【问题标题】:ASP.NET MVC - refreshing page after the form is submittedASP.NET MVC - 提交表单后刷新页面
【发布时间】:2017-04-10 20:35:56
【问题描述】:

我目前的要求是在第一次提交表单后向用户显示警告消息。当用户下次点击提交按钮时,应该保存,因为用户可以忽略警告信息。

我正在使用会话变量显示警告消息并将计数设置为“1”以显示警告消息。

问题是当用户刷新页面时,表单被提交,因为视图模型被传递给操作。我不希望刷新提交表单。

由于会话变量在第一次之后为 1,因此刷新也采用与提交操作相同的视图模型。

如果有办法区分 MVC 中的刷新和提交操作,请提供帮助。

【问题讨论】:

  • 同一个表格要提交两次?不只是显示确认对话框?
  • 是的,我需要两次显示同一个表单。我无法向他们显示对话框。
  • 看看这对你有没有帮助stackoverflow.com/questions/2126747/…
  • 感谢杰米的回复。我对此进行了调查,并遇到了问题。在我的场景中,用户不需要做任何事情来纠正警告并且可以被忽略。在此模式的第 4 步之后,如果用户进行刷新,则表单将重新提交。 1. GET “Products/Create” 2. 用户输入一些信息 3. POST “Products/Create” 4. 验证失败,重新显示带有警告的表单——用户更正输入 5. POST “Products/Create”跨度>

标签: asp.net-mvc-4


【解决方案1】:

这真的取决于警告的用途,警告是检查某事还是默认情况下警告总是存在?

如果默认情况下始终存在,最简单的解决方案是在第一次按下假提交按钮时通过一些 jquery 显示警告,并启用实际提交按钮,并在警告与假按钮一起出现时出现消失。所以在 html 的页面上隐藏并禁用带有 display: none 和 disabled 的提交按钮,并在同一个地方放置一个假按钮,然后在 js 中是这样的:

$('#yourformidhere').submit(function () {
            $('#fakesubmitbutton').hide();
            $('#realsubmitbutton'.show();
            $(this).find(':submit').prop('disabled', 'false');
        });

如果您必须检查服务器端的内容,则需要通过控制器返回页面和模型。在页面上使用隐藏标记设置为“1”,然后在控制器中执行检查并在检查失败时返回页面,其中标记更改为“2”的模型字段以及警告。然后用户可以再次提交表单,您的控制器操作会检查“2”,如果发现它允许提交表单而无需检查。

编辑 - 一个例子:

表格:

@using (Html.BeginForm()){

@Html.Hiddenfor(model => model.hidden)

@Html.EditorFor(model = model.data1)

<input type ="submit" value"submit"/>
}

视图模型:

public class someviewmodel{

public string data1 { get; set; }
public int hidden { get; set; }

}

控制器

public ActionResult forumsubmit(someviewmodel model)
        {

//check to see if this is the first submission attempt

if (model.hidden == null){

      //check for whatever you need regarding the warning e.g.

      if (model.data1 == needswarning){

      //add your warning message here if it is to appear on the page for example a viewbag
      ViewBag.warning = "you've been warned"

     //change hidden field to 1 to acknowledge first submission attempt
     model.hidden = 1;

     //returns view with information intact for second submission
     return View(model);
    }

}

//if you reach here in the controller action the hidden field is either not null or there is no need for a warning so you can now process the form and add info to db here.

return View("submitsuccess")

}

【讨论】:

  • 我必须在服务器端执行验证。这是我正在执行的步骤。 1. 创建/学生。隐藏字段设置为空。 2. 用户输入一些信息。 3. 发布“Student/Create/StudentViewModel” 4. 将隐藏字段设置为 1。 5. 视图显示警告消息。 6.发布表格Student/Create/StudentViewModel。(不更改表格上的任何信息,应保存数据)问题在步骤5和6之间。当用户刷新页面时,表格正在以用户身份提交不需要改变任何东西。表单在刷新时传递 ViewModel。
  • 控制器决定表单是否提交,所以你的控制器就是你的控制方法。在第一次提交时,隐藏字段为空,因此在控制器中我们执行警告检查,并用它检查隐藏字段是否 = null。如果 hidden field = null 则表单不会提交,而是控制器返回页面,其中模型和隐藏字段现在更改为 1。如果不清楚,请告诉我,我会尝试给你一个例子。跨度>
  • 添加了一个例子来回答
  • 感谢 Rob 提供的示例。我尝试过这个。第一次提交后,控制器将隐藏值作为 1 发送到视图,并且警告正确显示。再次提交表单时,hidden 的值再次变为 null。
  • 我想我不明白您遇到的问题。返回页面时,表单上的隐藏值将为 1,因此当您第二次提交表单时,隐藏值将提交为 1。隐藏的“变为 null”的值究竟是什么意思?
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 2013-09-21
  • 2013-02-09
  • 2016-09-19
相关资源
最近更新 更多