c# - 后退按钮和重新提交表单的问题

标签 c# asp.net-mvc-3 internet-explorer

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

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

我有这样一个模型:

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" />
}

还有一个显示细节的 View ,就像这样

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

You Selected: @Html.DisplayFor(model => model.SelectedItemId)

还有一个 Controller 来管理这一切:

  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);
        }

    }

我填写表格,按提交。我被重定向到结果 View ,一切正常。

然后我在浏览器中按返回键,我再次看到索引 View 。

然后我再次提交表单,事情变糟了。尽管该列表在浏览器中显示的是之前选择的值,但该模型并未使用我列表中的选定值重新填充。

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

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

最佳答案

好吧,我找到了解决方案。

简短的回答:不要在你的模型属性后面加上'Id'

当我第一次加载示例中的索引 View 时,渲染的内容如下:

<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

我可以忍受更改属性名称,但问题是它还会删除使用非侵入式验证所需的所有验证属性。谁能告诉我如何保留这些?

关于c# - 后退按钮和重新提交表单的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17574879/

相关文章:

c# - 使用 HttpWebRequest 模拟 Internet Explorer

javascript - 此 javascript 适用于除 Internet Explorer 之外的所有浏览器!

c# - 页面源码怎么能省略某些东西

datetime - MVC3 和 Razor - 将文本框中的日期时间字符串从 "mm/dd/yyyy 12:00:00 AM"更改为 "mm/dd/yyy"

asp.net-mvc-3 - ASP.NET MVC 3 和 jquery.unobtrusive-ajax.min.js

asp.net - MVC 应用程序的键盘快捷键

javascript - 使用 ie11 更改 javascript 中的函数时遇到问题

c# - 通用类无法接受直接指向通用类型限制的对象

c# - 使用元组 C# 循环列表

C# - Winforms - 事件流循环