模型显示无效,即使它包含值

时间:2017-04-05 06:03:40

标签: asp.net-mvc model-view-controller model-validation

我在mvc中有一个模型,如下所示

public class person
{
  [Required(ErrorMessage = "Please enter First Name.")]
  public string first_name {get;set;}
  [Required(ErrorMessage = "Please enter last Name")]
  public string last_name {get;set;}
   [Required(ErrorMessage = "Please enter |DOB")]
  public DateTime DOB {get;set;}


}

发布方法

[HttpPost]
public ActionResult save_person(person per)
{
if(per.first_name == null || per.first_name =="")
  per.first_name ="demo_first";
if(per.lastname == null || per.lastname =="")
  per.last_name ="demo_last";
if (ModelState.IsValid) //fails even assignment is done above
 {


  }

}

所以使用if条件我确保模型元素将包含至少一些值,但即使在那之后 ModelState.IsValid失败并返回到视图 first_name和last_name被要求

我们怎样才能实现这个逻辑?

2 个答案:

答案 0 :(得分:3)

目前还不清楚为什么模型上的first_namelast_name属性使用Required属性修饰,如果它们显然不是必需的。

这就是说,如果你想更新控制器中某些模型属性的值,你可能需要确保在ModelState中更新它:

if (per.first_name == null || per.first_name == "")
{
    per.first_name ="demo_first";
    ModelState.Remove("first_name");
    ModelState.SetModelValue("first_name", new ValueProviderResult(per.first_name, per.first_name, CultureInfo.InvariantCulture));
}

if (per.last_name == null || per.lastname == "")
{
    per.last_name ="demo_last";
    ModelState.Remove("last_name");
    ModelState.SetModelValue("last_name", new ValueProviderResult(per.last_name, per.last_name, CultureInfo.InvariantCulture));
}

if (ModelState.IsValid)
{
    ...
}

答案 1 :(得分:0)

我只想添加一些对实际文档的引用,以便为OP清除为什么更改方法中的属性不能解决他的问题。

From the docs:

  

处理模型状态错误

     

模型验证发生在每个之前   正在调用控制器操作,它是操作方法的   有责任检查ModelState.IsValid并做出适当的反应。   在许多情况下,适当的反应是返回某种形式   错误响应,最好详细说明模型验证的原因   失败。

这意味着,在调用ActionResult并设置MyTaskDefinition Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: - Name: myApp Image: user/myapp:latest Command: - ./myapp - Fn::If: - UseDryRun - --dryrun - Ref: AWS::NoValue Parameters: DryRun: Type: String AllowedValues: # No bool parameter in CFN - true - false Conditions: UseDryRun: !Equals [ !Ref DryRun, true ] 属性时,已经发生了验证。

根据您的评论:如果需要在不同的视图中使用相同的模型,但具有不同的验证要求,则最好使用适当的注释创建新的ViewModel:

.IsValid

在此之后,您始终可以将视图模型映射到实体模型或您当前正在执行的任何操作。但是,您可以避免使用不必要的代码来破坏控制器,以弥补架构中的错误。