2016-09-22 3 views
0

У меня есть небольшая проблема здесь, что каждый раз, когда я запускаю приложение, первый переключатель всегда проверяется, я хочу, чтобы монахиня переключателей была проверена. Как мне это сделать?Сделать переключатель не проверен при загрузке формы?

<div class="col-md-12"> 
    <!--<i class="fa fa-child" aria-hidden="true"></i>--> 
    @Html.LabelFor(model => model.CCommmunication, "Choose your preferred way of communication", new { @style = "", @class = "", id = "" }) 
    <span style="color: red;">*</span> 
    @*@Html.DropDownListFor(model => model.Profession, new SelectList(Model.Professions, "Id", "Name"), new { placeholder = "", @style = "", @class = "form-control", id = "Profession" })*@ 
    @Html.EnumRadioButtonFor(model => model.CCommmunication, false,false,"communicationCB") <!--first 2 paramerters are false false communicationCB is the class--> 
    @Html.ValidationMessageFor(model => model.CCommmunication) 
</div> 

это моя модель

[Required(ErrorMessage = "Please select preferred way of communication option")] 
     public Commmunication CCommmunication 
     { get; set; } 

     public enum Commmunication 
     { 
      [Display(Name = "Email", Order = 0)] 
      Email, 

      [Display(Name = "Mobile telephone", Order = 1)] 
      TelephoneNo, 

      [Display(Name = "Alternative telephone", Order = 2)] 
      TelephoneNoAlternative 
     } 

Это мой JavaScript

<script> 

     var checkedVal = $('.communicationCB input[name=CCommmunication]:checked').val(); //Added a variable to check the value 
     if (checkedVal == "TelephoneNo") { //if checked valuie 
      $('.confirmmobtelno').show(); //show this text box 
     } else { 
      $('.confirmmobtelno').hide(); //hide textbox 
     }; 

     if (checkedVal == "TelephoneNoAlternative") { //if checked valuie == to TelephoneNoalternative 
      $('.confirmalttelno').show(); //show confirm alt tel no text box 
     } else { 
      $('.confirmalttelno').hide(); //else hide it 
     }; 



     $('.communicationCB input[name=CCommmunication]').click(function() { //.communication class passed input name == model public communication 
      if ($(this).val() == "TelephoneNo") { //if value TelephoneNo selected in model 
       $('.confirmmobtelno').show(); //show this text box 
      } else { 
       $('.confirmmobtelno').hide(); //hide textbox 
      } 

      if ($(this).val() == "TelephoneNoAlternative") { //if value == to TelephoneNoalternative 
       $('.confirmalttelno').show(); //show confirm alt tel no text box 
      } else { 
       $('.confirmalttelno').hide(); //else hide it 
      } 
     }); 

Наконец у меня есть enumRadioButton.cs

public static class HtmlHelper 
    { 
     public static MvcHtmlString EnumRadioButtonFor<TModel, TProperty>(
       this HtmlHelper<TModel> htmlHelper, 
       Expression<Func<TModel, TProperty>> expression, 
       bool includeNoneOption = true, 
       bool isDisabled = false, 
       string cssClass = null 
      ) where TModel : class 
     { 
      var memberExpression = expression.Body as MemberExpression; 
      if (memberExpression == null) 
       throw new InvalidOperationException("Expression must be a member expression"); 

      var name = ExpressionHelper.GetExpressionText(expression); 
      var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
      ModelState currentValueInModelState; 
      var couldGetValueFromModelState = htmlHelper.ViewData.ModelState.TryGetValue(fullName, out currentValueInModelState); 
      object selectedValue = null; 
      if (couldGetValueFromModelState && htmlHelper.ViewData.Model != null) 
      { 
       selectedValue = expression.Compile()(htmlHelper.ViewData.Model); 
      } 

      var enumNames = GetSelectItemsForEnum(typeof(TProperty), selectedValue).Where(n => !string.IsNullOrEmpty(n.Value)).ToList(); 


      var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
      var sb = new StringBuilder(); 
      sb.AppendFormat(
       "<ul class=\"radio-button-list{0}\">", 
       string.IsNullOrEmpty(cssClass) ? string.Empty : " " + cssClass); 
      foreach (var enumName in enumNames) 
      { 
       var id = string.Format(
        "{0}_{1}_{2}", 
        htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, 
        metaData.PropertyName, 
        enumName.Value 
        ); 

       if (id.StartsWith("-")) 
        id = id.Remove(0, 1); 

       var value = enumName.Value; 

       sb.AppendFormat(
         //"<li>{2} <label for=\"{0}\">{1}</label></li>", //Originol puts data in a list 
         "{2} <label for=\"{0}\">{1}</label>", 
        id, 
        HttpUtility.HtmlEncode(enumName.Text), 
        isDisabled 
         ? htmlHelper.RadioButtonFor(expression, value, new { id, disabled = "disabled" }).ToHtmlString() 
         : htmlHelper.RadioButtonFor(expression, value, new { id }).ToHtmlString() 
        ); 
      } 
      sb.Append("</ul>"); 
      return MvcHtmlString.Create(sb.ToString()); 
     } 
     public static IList<SelectListItem> GetSelectItemsForEnum(Type enumType, object selectedValue) 
     { 
      var selectItems = new List<SelectListItem>(); 

      if (enumType.IsGenericType && 
       enumType.GetGenericTypeDefinition() == typeof(Nullable<>)) 
      { 
       enumType = enumType.GetGenericArguments()[0]; 
       selectItems.Add(new SelectListItem { Value = string.Empty, Text = string.Empty }); 
      } 

      var selectedValueName = selectedValue != null ? selectedValue.ToString() : null; 
      var enumEntryNames = Enum.GetNames(enumType); 
      var entries = enumEntryNames 
       .Select(n => new 
       { 
        Name = n, 
        DisplayAttribute = enumType 
         .GetField(n) 
         .GetCustomAttributes(typeof(DisplayAttribute), false) 
         .OfType<DisplayAttribute>() 
         .SingleOrDefault() ?? new DisplayAttribute() 
       }) 
       .Select(e => new 
       { 
        Value = e.Name, 
        DisplayName = e.DisplayAttribute.Name ?? e.Name, 
        Order = e.DisplayAttribute.GetOrder() ?? 50 
       }) 
       .OrderBy(e => e.Order) 
       .ThenBy(e => e.DisplayName) 
       .Select(e => new SelectListItem 
       { 
        Value = e.Value, 
        Text = e.DisplayName, 
        Selected = e.Value == selectedValueName 
       }); 

      selectItems.AddRange(entries); 

      return selectItems; 
     } 

    } 

} 
+0

Просьба показать, как объявлено поле CCommmunication – Andrei

+0

Его delcred в моей модели @Mike Debela [Обязательно (ErrorMessage = «Выберите предпочтительный способ связи»)] public Commmunication CCommmunication {get; задавать; } общественное перечисление Commmunication { [Дисплей (Name = "Отправить", Order = 0)] Email, [Display (Name = "Мобильный телефон", заказ = 1)] TelephoneNo, [Показать (Name = «Альтернативный телефон», Order = 2)] TelephoneNoAlternative } –

+0

@WaqarMalik Я думаю, что это связано с 'EnumRadioButtonFor (...)', где 'Enum' всегда имеет значение по умолчанию. Попробуйте использовать jQuery, чтобы отключить все переключатели на событии готовности документа. –

ответ

1

Чтобы иметь ни один из переключателей выбранный, вы делаете у nullable

[Required(ErrorMessage = "Please select preferred way of communication option")] 
public Commmunication? CCommmunication { get; set; } 

CCommmunication Если имеет начальное значение null, то не будет выбрана ни одна из кнопок радио.

Но его непонятно, что вы пытаетесь сделать со всем этим (ненужным) кодом в вашем методе расширения, в частности, почему вы создаете IList<SelectListItem> (который предназначен для создания тега <select>). Ваш помощник может быть просто

public static class RadioButtonHelper 
{ 
    public static MvcHtmlString EnumRadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
     string name = ExpressionHelper.GetExpressionText(expression); 
     Type type = Nullable.GetUnderlyingType(metaData.ModelType); 
     if (type == null || !type.IsEnum) 
     { 
      throw new ArgumentException(string.Format("The property {0} is not an enum", name)); 
     } 
     StringBuilder html = new StringBuilder(); 
     foreach (Enum item in Enum.GetValues(type)) 
     { 
      string id = string.Format("{0}_{1}", metaData.PropertyName, item); 
      StringBuilder innerHtml = new StringBuilder(); 
      innerHtml.Append(helper.RadioButtonFor(expression, item, new { id = id })); 
      innerHtml.Append(helper.Label(id, item.ToDescription())); 
      TagBuilder div = new TagBuilder("div"); 
      div.AddCssClass("radiobutton"); 
      div.InnerHtml = innerHtml.ToString(); 
      html.Append(div.ToString()); 
     } 
     TagBuilder container = new TagBuilder("div"); 
     container.AddCssClass("radiobutton-container"); 
     container.InnerHtml = html.ToString(); 
     return MvcHtmlString.Create(container.ToString()); 
    } 
} 

, который использует следующий метод расширения

public static class EnumExtensions 
{ 
    public static string ToDescription(this Enum value) 
    { 
     if (value == null) 
     { 
      return null; 
     } 
     FieldInfo field = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = (DescriptionAttribute[])field 
      .GetCustomAttributes(typeof(DescriptionAttribute), false); 
     if (attributes.Length > 0) 
     { 
      return attributes[0].Description; 
     } 
     return value.ToString(); 
    } 
} 

в сочетании с атрибутом [Description] применяется для ваших enum значений, а что атрибут [Display] (но вы можете легко изменить это)

+0

К сожалению, что не работает @Stephen Muecke –

+0

Я конечно это делаю (его с рабочего сайта) –

+0

Я просто скопирую весь код в классе EnumRadioButton.cs? @Stephen Muecke –