2013-07-10 46 views
3

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

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

我有像这样的模型:

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

+0

你是如何设置html表单的,你可以与表单分享代码吗 –

+0

我已经添加了表单顶部的部分,我已经省略了大部分,因为它更复杂底部 – CurlyPaul

回答

1

嗯,我找到了解决办法。

简短的回答:不与“ID”

后缀的模特属性当我第一次加载索引视图中的例子,这是获取呈现:

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

当我提交,按返回,然后查看源,这就是我得到:

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

注意,元素的名称已被更改,严重破坏MVC的解串器。

这可以在被贴出来,当我第一次发布形式的URL中可以看出,这是在浏览器中显示的网址:

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

然后,当我按下返回并重新发布,这是什么所示:

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

我可以改变属性名住,但麻烦的是,它还会去除所有需要使用不引人注目的验证验证属性。任何人都可以启发我如何保留这些?

+0

清除IE的临时文件(Ctrl + Shift + Del)。在开发MVC应用程序时,IE浏览器对高速缓存和后退按钮做了奇怪的事情,有时它显示了几周前的视图,即使视图在此之后已经正确显示了数百次。 – CodeCaster

+0

它似乎是由重定向浏览器的表单引起的,如果示例发生了改变,以致表单重新显示索引页面,问题就消失 – CurlyPaul

+0

@CodeCaster我也看到了IE,这是一个恼人的错误,但肯定会出现这种情况这种情况似乎并没有解决问题 – CurlyPaul

1

对,这绝对是所有现在正常工作。

这与我插入验证脚本标记的位置有关。我很懒,只是将它们卡在视图的顶部,所以当整个页面被组装并呈现时,它们就在主体中。

IE似乎对此不以为然,并且当后退按钮被按下时,脚本引用消失了,所有验证属性和'我'属性的名称都没有。有点奇怪,但你去

所以,故事的道德是总是把脚本放在正确的地方。