1

少なくとも 1 つのチェックボックスをオンにするか、テキストボックスに入力する必要があるフォームがあります。

私は、ViewModel 内の SelectedWasteTypes プロパティに必要なときに、CheckboxList を設定し、選択した値とテキスト ボックス (その他) の値を取る ViewModel を持っています。私の問題は、ビューに直接関連するフォーム要素がないため、このプロパティに対して検証できないことだと思います。私は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" />
}

Controller Logic (そう呼べるなら)

[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の使用を考えましたが、理想的には、この情報が確実にキャプチャされるようにサーバー側の検証が必要です(法的要件)。ただし、これがクライアント側でしか達成できない場合は、私はそれを受け入れます。

助言がありますか?

4

2 に答える 2

2

MVC フールプルーフ検証ライブラリをご覧ください。達成しようとしていることの検証属性があります:[RequiredIfEmpty]および[RequiredIfNotEmpty]. 条件付き検証に関する私の以前の SO 回答もご覧ください。

于 2015-02-27T14:51:21.087 に答える
0

IValidatableObjectViewModelに実装することをお勧めします。メソッド内Validate( ValidationContext validationContext)で、条件が満たされている天気を確認できます。例えば:

if(string.IsNullOrWhiteSpace(WasteTypeWebOther))
    yield return new ValidationResult("Your validation error here.");
于 2015-02-28T10:25:14.393 に答える