我有一个表单,其中必须至少选中一个复选框或填写文本框。
我有一个ViewModel,它填充CheckboxList,并在ViewModel中的SelectedWasteTypes属性需要时获取所选值加上textbox(其他)值。我认为我的问题是我无法对此属性进行验证,因为视图上没有与其直接相关的表单元素。我对MVC很新,这个让我难过。
来自ViewModel
public List<tblWasteTypeWeb> WasteTypeWebs { get; set; }
public string WasteTypeWebOther { get; set; }
public string SelectedWasteTypes { get; set; }
查看(细分)
@using (Html.BeginForm("OrderComplete", "Home"))
{
//Lots of other form elements
@for (var i = 0; i < Model.WasteTypeWebs.Count; i++)
{
var wt = Model.WasteTypeWebs[i];
@Html.LabelFor(x => x.WasteTypeWebs[i].WasteTypeWeb, wt.WasteTypeWeb)
@Html.HiddenFor(x => x.WasteTypeWebs[i].WasteTypeWebId)
@Html.HiddenFor(x => x.WasteTypeWebs[i].WasteTypeWeb)
@Html.CheckBoxFor(x => x.WasteTypeWebs[i].WasteTypeWebCb)
}
<br />
<span>
@Html.Label("Other")
@Html.TextBoxFor(x => x.WasteTypeWebOther, new { @class = "form-control input-sm" })
</span>
//More form elements
<input type="submit" value="submit" />
}
控制器逻辑(如果你可以这样称呼它)
[HttpPost]
public ActionResult OrderComplete(OrderViewModel model)
{
var sb = new StringBuilder();
if (model.WasteTypeWebs.Count(x => x.WasteTypeWebCb) != 0)
{
foreach (var cb in model.WasteTypeWebs)
{
if (cb.WasteTypeWebCb)
{
sb.Append(cb.WasteTypeWeb + ", ");
}
}
sb.Remove(sb.ToString().LastIndexOf(",", StringComparison.Ordinal), 1);
}
model.SelectedWasteTypes = sb.ToString();
if (!string.IsNullOrEmpty(model.WasteTypeWebOther))
{
if (!string.IsNullOrEmpty(model.SelectedWasteTypes))
{
model.SelectedWasteTypes = model.SelectedWasteTypes.TrimEnd() + ", " + model.WasteTypeWebOther;
}
else
{
model.SelectedWasteTypes = model.WasteTypeWebOther;
}
}
return View(model);
}
我非常感觉自己是某个小溪...我已经考虑过使用JQuery,但理想情况下我喜欢服务器端验证以确保捕获到这些信息(其中法律要求)。但是,如果这只能在客户端实现,我会忍受它。
有什么建议吗?
答案 0 :(得分:2)
看看MVC Foolproof Validation Library。它具有您要完成的验证属性:[RequiredIfEmpty]
和[RequiredIfNotEmpty]
。您还可以查看我的previous SO answer about Conditional Validation。
答案 1 :(得分:0)
我建议您在ViewModel中实现IValidatableObject
。
在Validate( ValidationContext validationContext)
方法内,您可以检查天气是否符合您的条件。例如:
if(string.IsNullOrWhiteSpace(WasteTypeWebOther))
yield return new ValidationResult("Your validation error here.");