2015-05-28 57 views
0

我有这些变量:做一个必填字段,如果其他字段值

public int? BossId { get; set; } 
public DateTime? HeadShipDate { get; set; } 

我的观点:

<div class="form-group"> 
    @Html.LabelFor(model => model.BossId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.DropDownList("BossId", null, "-- Select --", htmlAttributes: new { @class = "form-control" }) 
     @Html.ValidationMessageFor(model => model.BossId, "", new { @class = "text-danger" }) 
    </div> 
</div> 

<div id="divDate" class="form-group"> 
    @Html.LabelFor(model => model.HeadShipDate, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.HeadShipDate, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(model => model.HeadShipDate, "", new { @class = "text-danger" }) 
    </div> 
</div> 

脚本(我是想如果BossId有一个值,使所需) :

<script type="text/javascript"> 
     HeadShipDate: { 
       required: { 
        depends: function(element){ 
         return $("#BossId").text() != '-- Select --'; 
        } 
       } 
     } 
</script> 

控制器:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "Id,Name,Acronym,Percentage,BossId,HeadShipDate")] Department department) 
{ 
    Seller boss = db.Sellers.Find(department.BossId); 
    if (boss.AdmissionDate > department.HeadShipDate) 
     ModelState.AddModelError(string.Empty, "Headship Date (" + department.HeadShipDate.Value.ToShortDateString() + ") must be greater than the Admission Date (" + boss.AdmissionDate.ToShortDateString() + ") of boss"); 
    else if (ModelState.IsValid) 
    { 
     boss.DeptId = department.Id; 
     db.Departments.Add(department); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.BossId = new SelectList(SellersNonBosses(), "Id", "Name", department.BossId); 
    return View(department); 
} 

我想让HeadShipDate为必填字段如果在其他作品中,如果DropDownList的文本不是“ - Select - ”,那么IF BossId有一个值,并且我想进行验证在控制器中,使用JavaScript检查与特定销售商(Boss)的入场日期相关的头衔日期),我该如何做到这一点?

+0

什么是错的 “工作正常” 的事情吗? –

+0

我不问脚本1,我只是显示我的代码,我正在寻找解决方案脚本2和一个脚本示例,以验证(在控制器)与JS。你现在做了吗?顺便说一句,我会编辑.. – developer033

回答

1

在您的视图模型上实现IValidatableObject可以更好地控制像这样的临时验证规则。

public class Department : IValidatableObject 
{ 
    public int? BossId { get; set; } 
    public DateTime? HeadShipDate { get; set; } 
    ... 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(BossId.HasValue && !HeadShipDate.HasValue) 
     { 
      yield return new ValidationResult("HeadShipDate is required if BossId is selected.", new[] { "HeadShipDate" }); 
     } 
    } 
} 

然后你只需要在你的控制器行动检查ModelState.IsValid

注意:这只适用于模型状态的服务器端验证。如果你想要客户端验证,你需要实现一个Javascript函数,在提交表单之前做类似的事情。

例子:

$('form').validate({ 
    rules: { 
     HeadShipDate: { 
      required: { 
       depends: function (element) { 
        return $("#BossId").val() != ''; 
       } 
      } 
     } 
    }, 
    messages: { 
     HeadShipDate: { 
      required: "Please specify the Headship Date" 
     } 
    } 
}); 
+0

我要求客户端验证,无论如何,ModelState.IsValid会自动调用这个类“MyViewModel”?你看过我的剧本2吗?我错过了什么? [如果BossId有值,则需要headShip] ..谢谢。 – developer033

+0

是的,'ModelState'会自动获得MyViewModel的Validate方法的结果。 – kspearrin

+0

嗯,在我的情况下,它不是..我把断点看,什么也没有.. – developer033

相关问题