为啥我的 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 =&gt; x.DateTo) 将在您的表单中呈现一个隐藏字段,该字段将保存属性 DateTo 的值。如果有帮助,请告诉我。

以上是关于为啥我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Bootstrap 不允许我在 ASP.NET MVC 页面中的下拉菜单上设置边距?

关注点分离; MVC;为啥?

为啥 ASP.NET MVC 中的超时时间很短?

为啥 Laravel 附带 Vue? (SPA 与 MVC)

为啥我的 Jquery Ajax 调用不起作用?(Asp.net MVC C#)

.NET Core - 为啥我应该使用视图组件而不是集成在 MVC 应用程序或 Razor 页面中的 Blazor 组件