我有一个简单的模型如下
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>
感谢您的想法...
答案 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);
}
}