gpt4 book ai didi

c# - 是否可以在 ASP.NET MVC 5 ViewModel 中同时使属性可为空和必需?

转载 作者:行者123 更新时间:2023-11-30 21:46:09 25 4
gpt4 key购买 nike

我有以下 View 模型

public class FormViewModel
{
[Required]
public DateTime? LocalFrom { get; set; }

[Required]
public DateTime? LocalTo { get; set; }
}

然后在 Controller 中我有以下操作

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "LocalFrom,LocalTo")] FormViewModel model)
{
if (ModelState.IsValid)
{
var presenter = new ManagePresenter(model);
return View(presenter);
}
return View(model); // here model.LocalFrom, model.LocalTo should be null
}

这是我的 HTML 表单

<form class="form-horizontal" action="/Manage/Index" method="post">

@Html.AntiForgeryToken()
<div class="form-group">
<label class="control-label col-sm-2" for="LocalFrom">From</label>
<div class="col-sm-10">
<input type="datetime" class="form-control" id="LocalFrom" name="LocalFrom" value="@Model.LocalFrom" required>
</div>
</div>

<div class="form-group">
<label class="control-label col-sm-2" for="LocalTo">To</label>
<div class="col-sm-10">
<input type="datetime" class="form-control" id="LocalTo" name="LocalTo" value="@Model.LocalTo)" required>
</div>
</div>

<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>

</form>

我不确定在这里要求为 nullable 属性是否合乎逻辑。我基本上想在 Model.LocalFrom 为 null 时使用 blank 在 View 中使用名称 LocalFrom 填充输入,或者在 时使用正确的值code>Model.LocalFrom 不为空。

问题

然后 ModelState.IsValid 总是返回 false,即使我们所有必需的值都存在且有效。

当我使 LocalFromLocalTo 不可为 null 时,ModelState 变得有效。但是在 View 中会像这样显示时间的开始时间

enter image description here

如何将 null 值传递给 View 并使 ModelState 正确验证?

最佳答案

如果要允许 null 值,则需要从 DateTime 属性中删除 [Required] 属性。 [Required] 属性意味着该值不能为 null,因此如果您提交空值 (null),则 ModelState 将无效。

移除属性意味着提交有效日期或null 将有效,但提交无效日期仍将导致ModelState 无效。

此外,您手动生成 html,结果您没有获得正确的双向模型绑定(bind)(这就是为什么您在返回 View 时看到 DateTime 的默认值) .你的看法应该是

<div class="form-group">
@Html.LabelFor(m => m.LocalFrom, new { @class="control-label col-sm-2" }) // assumes you add [Display(Name = "From")] to the property
<div class="col-sm-10">
@Html.TextBoxFor(m => m.LocalFrom)
@Html.ValidationMessageFor(m => m.LocalFrom)
</div>
</div>

作为旁注,您应该删除不必要的 [Bind] 属性。您正在使用 View 模型,这意味着您已经免受过度发布攻击。

最后,在您的 View 中包含 jquery.validate.jsjquery.validate.unobtrusive.js 脚本,以便您获得与服务器端匹配的客户端验证验证属性和相应的错误消息显示在 View 中。

关于c# - 是否可以在 ASP.NET MVC 5 ViewModel 中同时使属性可为空和必需?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39478161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com