2009-03-09 2 views
2

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

Пример в бета-версии (возможно с 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 и set S проверяемого атрибута HTML при соответствующего

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

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

ответ

0

В качестве обходного пути я придумать следующее на основе свободно на методе 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 boolean просто заменяет точки в имени Html символами подчеркивания. При использовании нескольких флажков в HTML идентификаторы должны быть уникальными, поэтому я просто передаю уникальный идентификатор через коллекцию htmlAttributes.

+0

Я обернул это в другом общедоступном вспомогательном методе, чтобы установить значение isChecked из modelstate/viewdata, если вам интересно, почему это отмечено как личное. –

0

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

Вот как вы знаете, как была проверена коробка.

0

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

Смежные вопросы