【发布时间】:2026-01-18 16:45:01
【问题描述】:
我在视图中有一个输入框,用于指定日期
如果用户将此留空,ModelState 将返回 false 并将模型返回到视图。
但是,在这种情况下,DateTime 字段随后将填充值 DateTime.MinValue (01/01/0001)
如何从模型中清除这个值,并返回一个空白输入框?
谢谢
【问题讨论】:
我在视图中有一个输入框,用于指定日期
如果用户将此留空,ModelState 将返回 false 并将模型返回到视图。
但是,在这种情况下,DateTime 字段随后将填充值 DateTime.MinValue (01/01/0001)
如何从模型中清除这个值,并返回一个空白输入框?
谢谢
【问题讨论】:
如果您没有验证,则在模型中将该日期定义为nullable
DateTime? AnyDate {get; set;}
这样,问题就解决了。当用户不输入AnyDate 时,发布后将是null。如果它不起作用,你可以写在行动中:
if (!ModelState.IsValid)
{
//control for any case
if(model.AnyDate == DateTime.MinValue) model.AnyDate = null;
}
【讨论】:
如果要返回空值,则必须将模型的实体编辑为可为空,如下所示:
public Class MyObject
{
String parameter {get; set;}
DateTime? time {get; set;}
}
如果您想在重新渲染带有字段的页面之前更改用户输入的值,您必须将模型对象编辑为 DateTime.MinValue(例如),如下所示:
public ActionResult MyMethod(MyObject model)
{
if (ModelState.IsValid)
{
...
}
else
{
model.time = DateTime.MinValue;
}
return View(model);
}
【讨论】:
一旦您 POST 回您的视图,您将需要使用 SetModelValue() 方法来操作您的 ModelState(而不是您的模型)中的值。或者,您可以Remove() 有问题的条目,但这有其他含义(即破坏您在 ModelStateDictionary 对象中的模型)。
例如,如果您的数据元素被称为RequiredDateTime,那么您的控制器代码可能是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ThisAction(int id, YourModel model)
{
// Process the 'IsValid == true' condition
if (ModelState.IsValid)
{
// ...
return RedirectToAction("NextAction");
}
// Process the 'IsValid == false' condition
if (ModelState.ContainsKey("RequiredDateTime"))
{
ModelState.SetModelValue("RequiredDateTime", new ValueProviderResult(...));
}
// ...
return View(model);
}
编辑
一些额外的研究发现了以下内容,另请参阅:
MVC - How to change the value of a textbox in a post?
How to modify posted form data within controller action before sending to view?
我希望这会有所帮助。祝你好运!
【讨论】: