2011-12-28 87 views
3

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

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> 

}

回答

1

你为什么装饰等模特属性与属性验证他们是否应该被忽略?这没有任何意义,也不可能。

使用查看模型。为不同情况定义不同的视图模型,并基于视图模型和情况仅修饰需要验证的属性。或者更好的是,不要装饰任何东西,请使用FluentValidation.NET以流畅而强大的方式表达您的验证要求。

+0

我只装饰了单个属性,但仍然是我的模型状态无效 – RollerCosta 2011-12-28 12:01:54

+0

@Kannas,啊,这是不正常的,尤其是如果您在调用控制器操作时传递有效值。您想与我们分享的任何代码?请详尽:模型,控制器,视图。提供[sscce](http://sscce.org)。 – 2011-12-28 12:03:17

0

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

有关验证问题的最值得推荐的方式似乎是创建专用的ViewModels,因为它可以解决您可能会或可能不知道的其他几个问题。

到的ViewModels另一种方法是操纵的ModelState对象去挑选(或排除)属性来验证,像这样:

(这里有一些额外的代码去除魔弦)

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

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

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