繁体   English   中英

如何忽略Model属性的验证?

[英]How to ignore validation on Model Property?

一世。 e如何对模型的单个属性应用验证,同时忽略if(modelstate.Isvalid){}的其他(该模型的属性)?
模型

using System.ComponentModel.DataAnnotations;
namespace abc.Model
{
using System;
using System.Collections.Generic;

public partial class check_master
{
    public int MCheck_id { get; set; }
    [Required]
    public string check_name { get; set; }
    public string field { get; set; }
    public Nullable<byte> max_length { get; set; }
    public int check_id { get; set; }
}
}


视图

  @using (Html.BeginForm("addCheck", ""))
  {
  <input type="hidden" id="from" name="from" value="@ViewBag.from" readonly="readonly"  />
   <fieldset>


        <tr>
            <td>
                @Html.DropDownList("check_master", "--select checks--")
            </td>
            <td>
                @Html.TextBox("checkName", "")
                @Html.ValidationMessage("check_name")
            </td>
        </tr>
    </table>
</fieldset>
<p>
    <input type="submit" value="Add" />
</p>

}

使用[Bind(Exclude = "Property_Name")]

如果应该忽略它们,为什么要使用验证属性修饰其他模型属性? 这没有任何意义,这是不可能的。

使用视图模型 为不同的情况定义不同的视图模型,并根据视图模型和情境仅装饰您需要验证的属性。 或者甚至更好,不要装饰任何东西,使用FluentValidation.NET以流畅和强大的方式表达您的验证要求。

这是一个有点老问题,但我不相信它得到了适当的回答。 操纵绑定根本不会改变操作过程,因为验证发生在/同时绑定之前。 如上例所示,将属性标记为已排除仍将生成false modelstate.isvalid属性。

关于验证问题的最佳推荐方法似乎是创建专用的ViewModel,因为它会处理您可能或可能不知道的同一些其他问题。

ViewModels的替代方法是操纵modelstate对象以选择(或排除)要验证的属性,如下所示:

(这里有一些额外的代码来删除魔术字符串)

var modelPropAsString = nameof(yourmodel)+"."+nameof(yourmodel.Id);

        if (ModelState[modelPropAsString ].Errors.SingleOrDefault() != null)
        {
            ModelState[modelPropAsString ].Errors.Clear();
            yourmodel.Id = 0;
        }

以上将从验证中排除Id属性。 如果您愿意,可以转换代码以专门验证Id属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM