如何忽略Model属性的验证?

时间:2011-12-28 11:55:38

标签: asp.net asp.net-mvc-3

我。 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>

}

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这是一个有点老问题,但我不相信它已得到妥善回答。操纵绑定根本不会改变操作过程,因为验证发生在/同时绑定之前。 如上例所示,将属性标记为已排除仍将生成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属性。