1

在我看来,我有以下代码:

@using (Html.BeginForm()) {
  @Html.TextBox("Date2", Model.Date2)
  <br/>
  @Model.Date2
  <input type="submit" value="Create" />
}

在我的控制器中,我有:

    [HttpPost]
    public ActionResult Index(Home home){
        ViewBag.Message = "Welcome to ASP.NET MVC! (after a submit)";
        home.Date2 = home.Date2.AddDays(1);
        return View("Index", home);
    }

型号为:

public class Home {
    public DateTime Date2 { get; set; }
}

我的问题是:为什么当我点击提交按钮时,文本框显示的日期不是多一天的日期,而我直接输出的 html 日期是?

编辑:

如果我进入 MVC3 源代码,我可以看到private static MvcHtmlString InputHelper(...)获取具有良好日期的 value 参数,但后来代码从attemptedValue...获取旧值您可以在此处查看调试http://i.stack.imgur.com/x2mTI .png

4

3 回答 3

1

我遇到了同样的问题......它与传递给 Action 的属性有关,该属性与从 Action 返回的属性同名,但具有不同的值。

我无法回答为什么会发生这种情况,但我可以提供有关如何修复它的解决方案(好吧,可能不是您的情况,因为您接受并返回相同的模型)。

public Action(IncomingViewModel incomingViewModel)
{
    var viewModel = new ViewModel();
    //incoming Date has different name than outgoing date
    viewModel.Date2 = incomingViewModel.OldDate2;
    return viewModel;
}

就像我说的,这在你的情况下是一种黑客攻击(在我的情况下并没有那么大)。同样,它不能解决您的问题,但可能会让您更接近解决方案。

于 2012-04-09T17:58:07.263 回答
1

这是因为当从发布操作返回视图时,所有 MVC 辅助方法(Html.Textbox、Html.DropdownList 等)都使用发布的值而不是实际对象的值来呈现元素。

这使得返回带有验证错误的视图,例如,准确呈现用户的输入,而不是可以在操作中更改的其他值

于 2012-04-09T18:06:11.507 回答
1

ModelState将输入值的副本保存到表单字段中。通常,如果您在POST操作中显示表单,那是因为验证失败,因此您希望重新显示“尝试”值输入而不是新值(这是输入 HTML 帮助程序默认执行的操作)。

为了防止它使用尝试的值,您可以将其从 ModelState 中删除,例如:

    [HttpPost]
    public ActionResult Index(Home home)
    {
        ViewBag.Message = "Welcome to ASP.NET MVC! (after a submit)";
        ModelState.Remove("Date2");
        home.Date2 = home.Date2.AddDays(1);
        return View("Index", home);
    }
于 2012-04-09T18:07:45.723 回答