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

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

我有一个像这样的模型:

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


我可以更改属性名称,但是麻烦的是,它也剥夺了使用非侵入式验证所需的所有验证属性。有人可以启发我如何保留这些权利吗?

10-02 00:14
查看更多