Обрабатывать Nullable Types с помощью шаблона редактора - PullRequest
4 голосов
/ 14 октября 2011

Я разработал шаблон редактора, который принимает логические типы и создает раскрывающийся список, чтобы изменить значения по умолчанию true и false на Si и No.Теперь, когда я развернул приложение, я не понял, что boolean и Nullable<boolean> взяты одинаково и влияют на имя моего шаблона редактора (boolean.cshtml).Теперь я не хочу этого, я хочу изменить поведение editorfor, только когда тип данных модели был Nullable<boolean>, а не когда он логический.Как я могу справиться с этим ???

 @model Nullable<bool>

@{
    var listItems = new[]
    {
        new SelectListItem { Value = "true", Text = "Si" },
        new SelectListItem { Value = "false", Text = "No" }
    };  

}


@Html.DropDownListFor( model => model.Value, listItems)

Ответы [ 2 ]

14 голосов
/ 14 октября 2011

Вы не можете предотвратить их использование одного и того же шаблона редактора.Но вы можете справиться с этим в шаблоне редактора.У вас есть:

ViewData.ModelMetadata.IsNullableValueType

Если вы читаете эту статью, вы действительно можете увидеть, что шаблон по умолчанию делает с этим, чтобы переключаться между двумя различными визуализациями.Просто укради у него:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

3 голосов
/ 16 июня 2012

Мои представления / Shared / EditorTemplates / Boolean.cshtml работают в обоих направлениях, обрабатывая пустые и обычные флажки.

@model bool?
@{
    if (ViewData.ModelMetadata.IsNullableValueType)
    {
        <text><div class="RB"></text>
        Dictionary<string, object> yesAttrs = new Dictionary<string, object>();
        Dictionary<string, object> noAttrs = new Dictionary<string, object>();
        Dictionary<string, object> nullAttrs = new Dictionary<string, object>();

        yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes");
        noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No");
        nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA");


        if (Model.HasValue && Model.Value)
        {
            yesAttrs.Add("checked", "checked");
        }
        else if (Model.HasValue && !Model.Value)
        {
            noAttrs.Add("checked", "checked");
        }
        else
        {
            nullAttrs.Add("checked", "checked");
        }

        @Html.RadioButtonFor(x => x, "true", yesAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
        @Html.RadioButtonFor(x => x, "false", noAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
        @Html.RadioButtonFor(x => x, "", nullAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA" class="nostrong" title="Unknown or To Be Determined">tbd</label>
        @:</div>
    }
    else
    {
        ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName];
        bool value = Model ?? false;
        if (state != null && state.Errors.Count > 0)
        {
            <div class="input-validation-error" style="float: left"></div>
        }
        else
        {
            @Html.CheckBox("", value)
        }
    }
}

Раскрывающиеся списки только для 2-3 выбранных элементов не важны для пользователей;они требуют два щелчка, тогда как переключатели требуют только один щелчок (если у вас нет недвижимости).

Когда ваши клиенты / пользователи не приняли решение, не хотят его принимать, не думают, что вы знаете, что ответ - это ваше дело, или вам нужно отменить true/1/on/positive или false/0/off/negative поскольку ни один из них не является точным, третий параметр для Nullable<boolean> может представлять собой «Определено» (tbd), не задано, неизвестно или неприменимо (н / п).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...