问题返回按钮和重新提交表单

本文关键字:提交 表单 新提交 返回 按钮 问题 | 更新日期: 2023-09-27 18:22:00

当使用后退按钮并重新提交表单时,我遇到了问题,绑定到下拉列表的模型上的值在第二次提交时没有保留。

在现实生活中,这段代码是一个报告生成器——表单从用户那里收集参数,然后将其发布到显示数据的结果视图中。显然,这是一个相当复杂的代码,但下面我有一些简单的代码显示了相同的错误:

我有一个这样的模型:

public class HomeModel
{
    public string SomeText { get; set; }
    public long SelectedItemId { get; set; }
    public IEnumerable<SelectListItem> AvailableItems { get; set; }
}

一个提交模型实例的表单,如下所示:

@using(Html.BeginForm("Result", "Home", FormMethod.Get))
{
    @Html.EditorFor(model => model.SomeText)
    <br />
    @Html.DropDownListFor(model => model.SelectedItemId, Model.AvailableItems)
    <input type="submit" value="submit" />
}

还有一个显示细节的视图,就像一样

You Typed: @Html.DisplayFor(model => model.SomeText) <br />
You Selected: @Html.DisplayFor(model => model.SelectedItemId)

还有一个控制器来管理这一切:

  public class HomeController : Controller
  {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            HomeModel model = new HomeModel();
            List<SelectListItem> items = new List<SelectListItem>();
            for (int i = 0; i < 10; i++)
                items.Add(new SelectListItem() { Value = i.ToString(), Text = i.ToString() });
            model.AvailableItems = items;

            return View(model);
        }
        public ActionResult Result(HomeModel model)
        {
            return View(model);
        }
    }

我填写表格,按提交。我被重定向到"结果"视图,一切都很好。

然后我在浏览器中按回车键,我会再次看到"索引"视图。

然后我再次提交了表格,结果一切都变糟了。尽管列表在浏览器中显示了以前选择的值,但模型不会使用列表中的选定值重新填充。

字符串属性正在正确更新,在我显示这种行为的真实代码中也是如此。

这只发生在IE中,我使用的是版本9。

问题返回按钮和重新提交表单

我找到了解决方案。

简言之:不要在你的模型属性后面加上"Id"

当我第一次加载示例中的索引视图时,呈现的内容如下:

<SELECT id=SelectedItemId name=SelectedItemId data-val-required="The field is required"...>

当我提交时,按下返回,然后检查来源,这就是我得到的:

<select name="SelectedItem" id="SelectedItem">

请注意,元素的名称已经更改,严重干扰了MVC的反序列化程序。

这可以在发布的url中看到,当我第一次发布表单时,这是浏览器中显示的url:

http://localhost:57175/Home/Result?SomeText=999&SelectedItemId=1

然后,当我再次按下并发布时,显示的是:

http://localhost:57175/Home/Result?SomeText=999&SelectedItem=1

我可以接受更改属性名称,但问题是它还剥离了使用不引人注目的验证所需的所有验证属性。有人能告诉我如何保留这些吗?

好吧,现在一切都正常了。

这与我为验证插入脚本标记的位置有关。我很懒,只是把它们粘在视图的顶部,所以当整个页面组装和渲染时,它们就在主体中。

IE似乎对此表示异议,当按下后退按钮时,脚本引用消失了,所有验证属性和我的属性名称上的"Id"也消失了。有点奇怪,但来了

所以,这个故事的寓意就是要始终把剧本放在正确的位置。