为啥我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false
Posted
技术标签:
【中文标题】为啥我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false【英文标题】:Why does my ModelState.IsValid propery in my MVC application is equal to false when everything looks fine to me为什么我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false 【发布时间】:2017-05-10 21:47:11 【问题描述】:我可能在某个地方弄错了,因为当我调用我的[HttpPost]
ActionResult
时,ModelState.IsValid
属性总是等于 false。
这是我的 [HttpPost] 方法:
[HttpPost]
public ActionResult EditArticle(ArticleEditViewModel model)
//This ModelState.IsValid is allways false
if (ModelState.IsValid)
//Write something to database
这里是一样的,只是[HttpGet]方法:
public ActionResult EditArticle(Guid Id)
Article article = Controllers.ArticleController.GetById(Id);
if (article != null)
ArticleEditViewModel model = new ArticleEditViewModel()
articleID = article.articleID,
ValidFrom = article.ValidFrom,
ValidTo = (DateTime)article.ValidTo,
Code = article.Code,
;
return View(model);
return View("NotFound");
这是我的表单的外观(如您所见,代码不为空,并且 Valid to 和 valid from 也有一些价值):
但在我的 Visual Studio 中,当我调试时,我得到了下一个值:
我不明白为什么这个属性是空的,并且当ValidFrom
显示为“1.1.0001”时,它们在文本框中有一些值。
最后,这是我的观点:
@model MyProject.Web.Models.BaseData.ArticleEditViewModel
@using MyProject.DataAccess.Model
@using MyProject.Web.Helpers
@
ViewBag.Title = "Edit articles";
<div class="">
@using (html.BeginForm("EditArticle", "Articles", FormMethod.Post, new @class = "form-horizontal form-label-left", id = "demo-form2" ))
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.ArticleID)
<div class="form-group">
@Html.LabelFor(model => model.Code)
@Html.TextBoxFor(model => model.Code, new @class = "form-control", @disabled = "disabled" )
@Html.ValidationMessageFor(model => model.Code)
<span class="fa fa-barcode form-control-feedback right" aria-hidden="true"></span>
</div>
//Some other divs which and textboxes which are not important for us right now
<div class="form-group">
@Html.LabelFor(model => model.ValidFrom)
@Html.TextBoxFor(model => model.ValidFrom, new @class = "form-control", @disabled = "disabled" )
@Html.ValidationMessageFor(model => model.ValidFrom)
</div>
<div class="form-group">
@Html.LabelFor(model => model.ValidTo)
@Html.TextBoxFor(model => model.ValidTo, new @class = "form-control", @disabled = "disabled" )
@Html.ValidationMessageFor(model => model.ValidTo)
</div>
</div>
</div>
@section Scripts
@Scripts.Render("~/bundles/jqueryval")
【问题讨论】:
如果这些字段被禁用,它们的值将不会被发布。考虑使用不同的用户界面。 @KarelTamayo 你能给我推荐点什么吗? 我们来看看ArticleEditViewModel 是的。例如,您可以将只读值呈现为标签而不是文本框,并为实际值呈现隐藏字段(如果它们无法在控制器上计算)。或者渲染标签,以便用户可以看到但计算控制器上的值。 @KarelTamayo 您可以将此作为答案发布,我会接受它,因为在添加此内容后:@Html.HiddenFor(model => model.ApppropiatePropery) 我在 PostBack 上获得了值,有趣的是我正在获取值 ValidTo 和 ValidFrom 的当前日期时间,即使这不是它们的真实值,但无论如何它都比 null 或 1.1.0001... 【参考方案1】:如果字段被禁用,它们将不会被发布。
你有几个选择:
将只读字段呈现为标签
如果您无法计算只读字段的值,您可以使用隐藏字段来发布值:
@Html.HiddenFor(x => x.DateTo)
渲染禁用的输入
如果你知道你可以计算控制器中的值,那么你就可以 像现在一样渲染字段,但在条件之前的操作中,计算您知道未发布的值。
public IActionResult Edit(Model model)
// Calculate the values here
If (ModelState.IsValid)
// Do your stuff here...
希望这会有所帮助!
【讨论】:
能否请您尽快向我解释一下 @Html.HiddenFor(x => x.DateTo) 在我的视图中的含义以及我的 DateTo 具有某些意义值(当前datetime ) 在我的控制器中。 @Roxy'Pro 抱歉,我确实错过了您的最后一条评论。我会尽快回复你。我现在在办公室。 @Roxy'Pro 给你:dotnetfiddle.net/sV30W5。@Html.HiddenFor(x => x.DateTo)
将在您的表单中呈现一个隐藏字段,该字段将保存属性 DateTo
的值。如果有帮助,请告诉我。以上是关于为啥我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Bootstrap 不允许我在 ASP.NET MVC 页面中的下拉菜单上设置边距?
为啥 Laravel 附带 Vue? (SPA 与 MVC)
为啥我的 Jquery Ajax 调用不起作用?(Asp.net MVC C#)
.NET Core - 为啥我应该使用视图组件而不是集成在 MVC 应用程序或 Razor 页面中的 Blazor 组件