3

ブール値フィールドでリモート検証を使用する必要があります。次のようなビューモデルがあります。

public class ViewModel
{   
    [Remote("ValidMePlease", "Home", AdditionalFields = "SomeKindOfDate", ErrorMessage = "use date with true")]
    public bool IsSomething {get;set;}
    public DateTime? SomeKindOfDate {get;set;}
}

私のコントローラー:

[OutputCache(Location = System.Web.UI.OutputCacheLocation.None, NoStore = true)]
public class HomeController : Controller 
{
    public JsonResult ValidMePlease(bool IsSomething , DateTime? SomeKindOfDate )
    {
        if (IsSomething && !SomeKindOfDate .HasValue)
            return Json(false, JsonRequestBehavior.AllowGet);
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

私の見解:

<div class="control">
    @Html.LabelFor(m => m.IsSomething , new { @class = "control-label" })
    <div class="controls">
        <label class="radio inline">
            @Html.RadioButtonFor(m => m.IsSomething , false) No
        </label>
        <label class="radio inline">
            @Html.RadioButtonFor(m => m.IsSomething, true) Yes
        </label>
    </div>
</div>

私のレンダリングされたビュー:

   <div class="control">
        <label class="control-label" for="IsSomething ">Is something</label>
        <div class="controls">
            <label class="radio inline">
                <input checked="checked" data-val="true" data-val-remote="use date with true" data-val-remote-additionalfields="*.IsSomething ,*.SomeKindOfDate" data-val-remote-url="/admin/User/ValidMePlease" data-val-required="Is something is required." id="IsSomething " name="IsSomething " type="radio" value="False" /> No
            </label>
            <label class="radio inline">
                <input id="IsSomething " name="IsSomething " type="radio" value="True" /> Yes
            </label>
        </div>
</div>

アイデアは、ブールフィールドが true の場合、日付を要求する必要があるということです。そして、何が問題なのですか。フォームを送信すると、常にリモート メソッドで渡さfalseれます。最初の入力のみに属性があるために発生すると思います。任意の提案をいただければ幸いです。IsSomethingValidMePleasedata-val-

4

1 に答える 1

5

「リモート」バリデーターの jquery.validate.unobtrusive.js にバグがあるようです。この行を置き換えてみてください:

return $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']").val();

と:

var $input = $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']");
if ($input.is(":radio")) {
    return $input.filter(":checked").val();
} else {
    return $input.val();
}

はいオプションを選択したときにフィールドが有効であることを確認するには、両方のラジオボタンに同じバリデーターが必要です。

もう 1 つの小さなことは、id が HTML 内で一意であることを確認することです。あなたの例から、同じ id 属性を持つ両方のラジオボタンがあります。私は次のようなものを使用します:

@Html.RadioButtonFor(m => m.IsSomething, false, new { id = "IsSomething_False" })
@Html.RadioButtonFor(m => m.IsSomething, true, new { id = "IsSomething_True" })

追加: id 属性を変更せずに検証が機能するはずです。

ID は定義上、どのシステムでも一意である必要があるため、一意であることを確認することで、w3c.org に対して検証するときだけでなく、各ラジオ ボタンにラベルを追加するときにも役立ちます。

于 2013-11-08T02:08:55.657 に答える