为什么在文本框中显示我的日期时间结果与直接将其显示在 html 中不同
本文关键字:显示 html 时间 文本 我的 日期 结果 为什么 | 更新日期: 2023-09-27 18:30:26
在我看来,我有以下代码:
@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; }
}
我的问题是:为什么当我点击提交按钮时,文本框显示的不是多 1 天的日期,而我直接输出的 html 是日期?
编辑:
如果我进入 MVC3 源代码,我可以看到private static MvcHtmlString InputHelper(...)
获取带有良好日期的 value 参数,但后来代码从 attemptedValue
中获取旧值......您可以在此处查看调试 https://i.stack.imgur.com/x2mTI.png
ModelState
将输入的值的副本保存到表单域中。通常,如果您在POST
操作中显示表单,这是因为验证失败,因此您希望重新显示"尝试的"值输入而不是新输入(这是输入 HTML 帮助程序默认执行的操作)。
为了防止它使用尝试的值,您可以将其从模型状态中删除,例如:
[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);
}
我遇到了同样的问题......它与传递给操作的属性有关,该属性与从操作返回的属性同名,但具有不同的值。
我无法回答为什么会发生这种情况,但我可以提供有关如何解决它的解决方案(好吧,也许在您的情况下不是,因为您正在接受并返回相同的模型)。
public Action(IncomingViewModel incomingViewModel)
{
var viewModel = new ViewModel();
//incoming Date has different name than outgoing date
viewModel.Date2 = incomingViewModel.OldDate2;
return viewModel;
}
就像我说的,在你的情况下,这是一种黑客攻击(在我的情况下,这不是那么大)。 同样,它不能解决您的问题,但可能会使您更接近解决方案。
这是因为当从发布操作返回视图时,所有 MVC 帮助程序方法(Html.Textbox、Html.DropdownList 等)都使用已发布的值来呈现元素,而不是实际对象的值。
这使得返回带有验证错误的视图,例如,准确呈现用户的输入,而不是可以在操作中更改的其他值