【问题标题】:MVC Validate At Least One Checkbox Or a Textbox is SelectedMVC 验证至少一个复选框或一个文本框被选中
【发布时间】:2015-02-27 14:35:46
【问题描述】:

我有一个表单,其中必须至少选中一个复选框或填写一个文本框。

我有一个 ViewModel,它填充 CheckboxList 并在 ViewModel 中的 SelectedWasteTypes 属性需要时获取所选值加上文本框(其他)值。我认为我的问题是我无法针对此属性进行验证,因为视图上没有与其直接相关的表单元素。我对 MVC 很陌生,这个让我很难过。

从视图模型

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,但理想情况下,我希望服务器端验证以确保捕获此信息(这是法律要求)。但是,如果这只能在客户端实现,我会接受它。

有什么建议吗?

【问题讨论】:

    标签: validation asp.net-mvc-5 checkboxfor


    【解决方案1】:

    看看MVC Foolproof Validation Library。它具有您想要完成的验证属性:[RequiredIfEmpty][RequiredIfNotEmpty]。你也可以看看我的previous SO answer about Conditional Validation

    【讨论】:

    • 谢谢。我不确定我应该验证什么。复选框列表来自 ViewModel 中的 ,最终属性实际上并未在表单中表示,而是作为选中的复选框和文本框之间的连接添加到 viewModel。
    【解决方案2】:

    我建议您在 ViewModel 中实现 IValidatableObject。 在Validate( ValidationContext validationContext) 方法中,您可以检查是否满足您的条件。例如:

    if(string.IsNullOrWhiteSpace(WasteTypeWebOther))
        yield return new ValidationResult("Your validation error here.");
    

    【讨论】:

    • 当我添加验证时,ViewModel 似乎在 pageLoad 上验证,而不是当我单击提交时。难道我做错了什么?但是,我已经用你的建议在其他地方取得了良好的效果!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2011-03-13
    • 2015-11-06
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多