ASP.net MVC RC2 - Флажки с явными значениями - PullRequest
2 голосов
/ 09 марта 2009

Есть ли простой способ использовать существующие Html-помощники для генерации списка флажков с явными значениями (как это было возможно в бета-версии)?

Пример в бета-версии (возможно, с MVC Contrib):

.CheckBox("Field", 6, new { value = 6}) будет выводить:

<input id="Field1" type="checkbox" value="6" name="Field" />
<input id="Field2" type="hidden" value="6" name="Field" />

еще в RC2 я получаю:

<input id="Field1" type="checkbox" value="6" name="Field" />
<input type="hidden" value="false" name="Field" />

NB. Я использую собственное вспомогательное расширение. который генерирует уникальный HTML id s и устанавливает проверенный атрибут HTML, когда соответствующий

Помимо использования необработанного HTML и не использования Html Helpers, есть способ установки флажков с явными значениями? Глядя на исходный код Codeplex для RC2, кажется, что это нелегкий путь, поскольку .InputHelper() помечен private, поэтому вы не можете использовать его для помощи.

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

Ответы [ 3 ]

0 голосов
/ 09 марта 2009

В качестве обходного пути я предложил следующее, основанное на методе InputHelper исходного кода RC2, но адаптировав его для нескольких значений:

private static string CheckBoxWithValue(this HtmlHelper htmlHelper, string name, object value, bool isChecked, bool setId, IDictionary htmlAttributes)
        {
            const InputType inputType = InputType.CheckBox;
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentException("null or empty error", "name");
            }

            var tagBuilder = new TagBuilder("input");
            tagBuilder.MergeAttributes(htmlAttributes);
            tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
            tagBuilder.MergeAttribute("name", name, true);
            string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);

            if (isChecked)
            {
                tagBuilder.MergeAttribute("checked", "checked");
            }
            tagBuilder.MergeAttribute("value", valueParameter, true);
            if (setId) tagBuilder.GenerateId(name);

            // If there are any errors for a named field, we add the css attribute.
            ModelState modelState;
            if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState))
            {
                if (modelState.Errors.Count > 0)
                {
                    tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
                }
            }
            var inputItemBuilder = new StringBuilder();
            inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));

            var hiddenInput = new TagBuilder("input");
            hiddenInput.MergeAttributes(htmlAttributes); 
            hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
            hiddenInput.MergeAttribute("name", name);
            if (setId)
            {
                hiddenInput.GenerateId(name);
            }
            hiddenInput.MergeAttribute("value", valueParameter);

            inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing));
            return inputItemBuilder.ToString();

        }

Это полагается на .ToString (), чтобы вы оценили значение объекта, но достаточно для моего сценария, где я использую целые числа для представления опций с поиском, выполненным в серверной базе данных. Обратите внимание, что логическое setId просто заменяет точки в имени HTML символами подчеркивания. При использовании нескольких флажков в HTML идентификаторы должны быть уникальными, поэтому вместо этого я просто передаю уникальный идентификатор через коллекцию htmlAttributes.

0 голосов
/ 10 марта 2009

Если вы недавно перешли с «обычного» ASP.Net и начали использовать MVC, то вы, возможно, очень хотите не печатать прямой HTML, но в мире MVC это не такая большая проблема, поскольку больше нет любое состояние и другие проблемы, с которыми приходится сталкиваться. Поэтому не стесняйтесь использовать простой HTML, если хотите, особенно если вы имеете дело только с целыми числами (не нужно беспокоиться о внедрении JavaScript или о чем-либо еще).

0 голосов
/ 09 марта 2009

Если свойство, к которому относится поле, имеет тип Int, тогда, как мне кажется, false будет преобразовано в 0.

Вот откуда вы знаете, как флажок был установлен или нет.

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