2012-01-12 59 views
1

让我们创建空的asp.net mvc 3应用程序。 代码是奇怪的行为Html.BeginForm

namespace MvcApplication1.Controllers 
{ 
public class MyModel 
{ 
    public int Id { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return Index1(new MyModel() {Id = 100}); 
    } 
    public ActionResult Index1(MyModel model) 
    { 
     var nm = new MyModel(); 
     nm.Id = model.Id + 1; 
     return View("test", nm); 
    } 
} 

允许创建名为测试共享视图。查看代码是

@using MvcApplication1.Controllers 
@model MyModel 

@if (Model != null) 
{ 
    using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" })) 
    { 
    <div id="compareQuestions"> 
     <p>@Model.Id</p> 
     @Html.HiddenFor(m => m.Id) 
     @Html.TextBoxFor(m => m.Id) 
     <input type="submit" value="save"/> 
    </div> 
    } 
} 

当我们发布的形式第一次全部是好的,但在之后不正确的文本框的第一篇文章时的值重新加载。如果我们改变这个值并在控制器上保存后,我们得到的模型的值不正确,但不是我们输入的值。这怎么可能?

+1

在第二个帖子,是隐藏字段的值101?如果不是,什么是不正确的值,什么应该是正确的值? – danludwig 2012-01-12 20:41:47

+0

呃,错误的值是101 – Ph0en1x 2012-01-12 20:44:25

+0

'

@ Model.Id

'呈现的是什么? “@ Html.HiddenFor(m => m.Id)'呈现的是什么?那么'@ Html.TextBoxFor(m => m.Id)'? – danludwig 2012-01-12 20:54:43

回答

2

<p>@Model.Id</p>@Html.HiddenFor(m => m.Id)之间有显着性差异。

当您张贴表单时,所有POST'的值都存储在ModelState中。
当您使用HtmlHelper方法时,它们首先从ModelState中提取值。如果ModelState不包含值,则它会查看实际的m.Id

因此,当您第一次获得表格时,没有ModelState。但是,一旦POST POST表单,它将值存储到ModelState,所以隐藏的输入使用该值而不是m.Id

如果你希望总是用m.Id,那么你需要清除控制器的ModelState

public ActionResult Index1(MyModel model) 
{ 
    ModelState.Clear(); 
    ... 
+0

但实际上为什么它的实现方式如此呢? – Ph0en1x 2012-01-12 21:14:43

+0

这是验证的机制。如果您提交的表单输入无效,ModelState会保存该输入,以便在重新显示表单时,这些字段不为空。例如,如果我的模型需要'int',并且键入'abc',那么表单将以'abc'和一条错误消息重新显示。 – 2012-01-12 22:06:45

1

看起来这是正确的行为,因为您已经编写了您的操作方法。在视图中,您为相同的确切模型属性呈现文本框和隐藏字段。

因此,当您在帖子期间将ID增加1时,您正在将文本框中的值增加到隐藏字段中。

如果您希望文本框和隐藏字段在第二篇文章后有不同的值,那么您的模型需要不同的属性。

另一个问题可能是,由于您有两个不同的<input元素具有相同的名称,因此您无法确定表单是否会从隐藏字段或文本框中发送值。再次,如果这两个字段应该有不同的值,它们需要在模型上具有不同的属性。如果您希望它们始终保持相同的值,请在视图中放置一个TextBox或Hidden,但不能同时使用两者。

+0

不,你不明白题。当然它提供相同的价值,但价值是错误的。

@ Model.Id

@ Html.HiddenFor(m => m.Id)具有不同的值,但它们应该具有相同的值 – Ph0en1x 2012-01-12 20:50:56