mvc模型绑定和空检查

时间:2016-03-09 14:13:11

标签: c# asp.net-mvc asp.net-mvc-4

我有一个简单的模型如下

public class TestModel
{
    public string property1 {get;set;}
    public string property2 {get;set;}
}

在我的剃刀视图中,我有两个映射到这两个属性的文本框。 只有一个文本框是必填字段,而另一个文本框可以留空。(可以输入property1或property2,也可以输入两者。但是两者都不能留空)

我的控制器动作方法非常简单

     public ActionResult MyMethod(TestModel tmodel)
     {
          //code fails on this null check..object reference not set to instance of object 
          if (!string.IsNullOrEmpty(tmodel.property1))
          {
          }
      }

如果我在我的模型属性上执行此操作,则上述语句有效..为什么单独为null失败?

 [DisplayFormat(ConvertEmptyStringToNull = false)]

我不明白为什么string.IsNullOrEmpty失败了?

以下是视图..

     <div class="form-group">
        @Html.LabelFor(m => m.property1, new { @class = "col-sm-3 control-label" })
        <div class="col-sm-4">
            @Html.TextBoxFor(m => m.property1, new { @class = "form-control"})
        </div>          
    </div>

    <div class="form-group">
         @Html.LabelFor(m => m.property2, new { @class = "col-sm-3 control-label" })
         <div class="col-sm-4">
        @Html.TextBoxFor(m => m.property2, new { @class = "form-control" })
    </div>

感谢您的想法...

3 个答案:

答案 0 :(得分:0)

使用此代码,我猜你永远不会到达string.IsNullOrEmpty代码。但是你必须向我们展示解决真正问题的观点。

    public ActionResult MyMethod(TestModel tmodel)
    {
       if(tmodel != null)
       {
          if (!string.IsNullOrEmpty(tmodel.property1))
          {
          }
       }              
   }

答案 1 :(得分:0)

- 编辑 - 要执行复杂的验证逻辑,请在ViewModel上实现IValidatableObject

public class TestModel : IValidatableObject {

    public string property1 {get;set;}
    public string property2 {get;set;}

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
         if (string.IsNullOrWhiteSpace(property1) && string.IsNullOrWhiteSpace(property2)) {
              yield return new ValidationResult(
                  "some error message", 
                  new[] { "property1", "property2"}
              );
         }
     }
}

检查控制器操作中的ModelState:

public ActionResult MyMethod(TestModel tmodel) {
   if(!ModelState.IsValid) {
      // error handling here
   }              
}

答案 2 :(得分:0)

您可以这样检查:

public ActionResult MyMethod(TestModel tmodel)
        {
            if (string.IsNullOrEmpty(tmodel.property1) && string.IsNullOrEmpty(tmodel.property2))
            {
                ModelState.AddModelError("property1", "The field property1 can only be empty if property2 is not");
                ModelState.AddModelError("property2", "The field property2 can only be empty if property1 is not");
            }

            if (ModelState.IsValid)
            {
                return RedirectToAction("otherAction");   //or do whatever you want            
            }
            else
            {
                //back to form with the errors highlighted
                return View(tmodel);
            }
        }