19

オブジェクトの 1 つに null 許容ブール値のプロパティがあります。ロジックで true を Yes、false を No、null を N/A にします。多くの異なるオブジェクトにこのような複数のプロパティを設定するので、エディタを作成してこれらのプロパティのテンプレートを表示するのが最も理にかなっています。これがすべて機能した後、jQuery UI を使用してボタンセットの視覚要素を適用しますが、今のところ、それは私の問題の範囲を超えています。私のエディター テンプレートは次のようになります。

@model bool?
<div data-ui="buttonset">
@Html.RadioButtonFor(x => x, true, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes"}) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
@Html.RadioButtonFor(x => x, false, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
@Html.RadioButtonFor(x => x, "null", new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>

私の問題は、どのような状況でも、このエディター テンプレートでモデルの現在の値を正しく表示できないことです。このスコープではモデルのプロパティをレンダリングするのではなく、モデル自体をレンダリングしているため、MVC3 の組み込みロジックは、名前が空または null でないことを確認するために行われるチェックのために、checked プロパティを正しく設定しません (MVC3 を参照)。ソース、InputExtensions.cs:line#259)。モデルと比較してチェックされた属性を動的に設定することはできません。ブラウザは値ではなくチェックされた属性の存在でラジオボタンをチェックするため、ラジオボタンは次のように見えますが、最後のものがまだ選択されています.

<div class="span-4" data-ui="buttonset">
<input checked="checked" id="MyObject_BooleanValueYes" name="MyObject.BooleanValue" type="radio" value="True" /><label for="MyObject_BooleanValueYes">Yes</label>
<input checked="" id="MyObject_BooleanValueNo" name="MyObject.BooleanValue" type="radio" value="False" /><label for="MyObject_BooleanValueNo">No</label>
<input checked="" id="MyObject_BooleanValueNA" name="MyObject.BooleanValue" type="radio" value="null" /><label for="MyObject_BooleanValueNA">N/A</label>
</div><span class="field-validation-valid" data-valmsg-for="MyObject.BooleanValue" data-valmsg-replace="true"></span>&nbsp;</div>

if?truevalue:falsevalue真/偽の部分が異なる匿名型になり、エラーが発生するため、次のようなものを使用して HtmlAttribute を条件付きで追加することはできません。

私はこれをどのように行うべきかについて苦労しています。この問題に取り組む方法について提案があることを願っていますか?

4

6 に答える 6

2

「1行ですべてを支配する」ということを維持するための拡張メソッドの楽しみはどうですか。:-)

public static class DictionaryHelper
{
    // This returns the dictionary so that you can "fluently" add values
    public static IDictionary<TKey, TValue> AddIf<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, bool addIt, TKey key, TValue value)
    {
        if (addIt)
            dictionary.Add(key, value);
        return dictionary;
    }
}

次に、テンプレート ファイルで、checked="checked" 属性を含む追加パラメータを要素に追加する方法の署名を変更するだけです。

@model bool?
<div data-ui="buttonset">
@Html.RadioButtonFor(x => x, true, new Dictionary<string,object>()
    .AddIf(true, "id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes")
    .AddIf(Model.HasValue && Model.Value, "checked", "checked")
) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>

@Html.RadioButtonFor(x => x, false, new Dictionary<string,object>()
    .AddIf(true, "id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No")
    .AddIf(Model.HasValue && !Model.Value, "checked", "checked")
) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>

@Html.RadioButtonFor(x => x, "null", new Dictionary<string,object>()
    .AddIf(true, "id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA")
    .AddIf(!Model.HasValue, "checked", "checked")
) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>
于 2012-12-26T19:07:04.900 に答える
1

次のように特別な null ケースを処理する必要があります。

<label class="radio">
  @Html.RadioButtonFor(x => x.DefaultBillable, "", new { @checked = !this.Model.DefaultBillable.HasValue })
  Not set
</label>
<label class="radio">
  @Html.RadioButtonFor(x => x.DefaultBillable, "false")
  Non-Billable
</label>
<label class="radio">
  @Html.RadioButtonFor(x => x.DefaultBillable, "true")
  Billable
</label>
于 2013-04-16T21:11:28.490 に答える