让我们创建空的asp.net MVC3应用程序。代码是
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);
}
}让我们创建一个名为test的共享视图。查看代码是
@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>
}
}当我们第一次发布表单时,一切都是正常的,但当它在第一次发布后重新加载文本框中的值时就不正确了。如果我们改变这个值并在控制器上保存post,我们得到的模型有不正确的值,但不是我们输入的值。这怎麽可能?
发布于 2012-01-13 05:10:35
<p>@Model.Id</p>和@Html.HiddenFor(m => m.Id)有很大的不同。
当您发布表单时,所有发布的值都存储在ModelState中。
当您使用HtmlHelper方法时,它们首先从ModelState中提取值。如果ModelState不包含值,那么它将查看实际的m.Id。
因此,当您第一次获得表单时,没有ModelState。但是一旦您发布表单,它就会将值存储到ModelState中,因此隐藏的输入将使用该值而不是m.Id。
如果您希望始终使用m.Id,则需要清除控制器中的ModelState:
public ActionResult Index1(MyModel model)
{
ModelState.Clear();
...发布于 2012-01-13 04:48:27
看起来这是正确的行为,因为您已经编写了您的操作方法。在视图中,您将为同一模型属性呈现文本框和隐藏字段。
因此,当您在post期间将Id递增1时,您将递增文本框和隐藏字段中的值。
如果你想让文本框和隐藏字段在第二篇文章之后有不同的值,你需要在你的模型上有一个不同的属性。
另一个问题可能是,因为您有两个同名的不同<input元素,所以您不能确定表单将发送隐藏字段或文本框中的值。同样,如果这两个字段应该具有不同的值,则它们需要在模型上具有不同的属性。如果希望它们总是相同的值,可以在视图中放入TextBox或Hidden,但不能同时放入这两个值。
https://stackoverflow.com/questions/8841795
复制相似问题