2013-07-26 37 views
0

我refferd這個帖子article stacoverflowsecond article sackoverflow不需要radioButtolListFor幫手 - MVC

和我使用RadioButtonListFor

public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, 
     IEnumerable<SelectListItem> listOfValues, 
     IDictionary<string, object> radioHtmlAttributes = null, 
     string ulClass = null) 
     { 
      ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

      if (radioHtmlAttributes == null) 
       radioHtmlAttributes = new RouteValueDictionary(); 

      TagBuilder ulTag = new TagBuilder("ul"); 
      if (!String.IsNullOrEmpty(ulClass)) 
       ulTag.MergeAttribute("class", ulClass); 

      if (listOfValues != null) 
      { 
       // Create a radio button for each item in the list 
       foreach (SelectListItem item in listOfValues) 
       { 

        // Generate an id to be given to the radio button field 
        var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value); 

        if (!radioHtmlAttributes.ContainsKey("id")) 
         radioHtmlAttributes.Add("id", id); 
        else 
         radioHtmlAttributes["id"] = id; 

        // Create and populate a radio button using the existing html helpers 
        var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text)); 
        var radio = htmlHelper.RadioButtonFor(expression, item.Value, radioHtmlAttributes).ToHtmlString(); 

        // Create the html string that will be returned to the client 
        // e.g. <input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" /><label for="TestRadio_1">Line1</label> 
        ulTag.InnerHtml += string.Format("<li>{0}{1}</li>", radio, label); 
       } 
      } 

      return MvcHtmlString.Create(ulTag.ToString(TagRenderMode.Normal)); 
     } 

我的問題是,單選按鈕是必需的,當我不檢查一個單選按鈕我有一個錯誤該字段是強制性的,我該如何禁用? (在我看來,型號我不使用dataAnnotation必填)

這是我的視圖模型的一部分:

public class RegistrationViewModel 
    { 
      #region country 
      public string Country { get; set; } 
      private string CountryLabel { get; set; } 
      public ConfigurationParamValue CountryParam { get; set; } 
      #endregion 

      #region civilty 
      public int Civility { get; set; } 
      public ConfigurationParamValue CivilityParam { get; set; } 
      public string CivilityLabel { get; set; } 
      public List<Civility> ListCivilitys { get; set; } 
      #endregion 

} 

,這是我的觀點的一部分:

<div id="city"> 
      <div class="editor-label" style="@visibleCivility"> 
        @Html.GetResource(Model.Category,Model.IsLocal,Constantes.CivilityLabel) 
       <div style="@mandatoryCivility">*</div> 
      </div> 
      <div class="editor-field"> 
       @Html.RadioButtonListFor(m => m.Civility, new SelectList(Model.ListCivilitys,"ID","Name")) 
       @Html.ValidationMessageFor(model => model.Civility) 
      </div> 
     </div> 
+1

然而,您可以顯示模型類的定義嗎? – Andrei

+0

您可能有必填字段驗證程序? –

+0

我編輯的問題添加一些詳細的,我不使用所需的驗證程序 – user1428798

回答

1

我不是肯定爲什麼,但看起來HtmlHelper.RadioButtonFor方法返回一個包含「data-val-required」屬性的標籤。 如果你根本不希望此字段都被驗證,你可以只是這個元素禁用ClientValidation就像這個例子:

@{Html.EnableClientValidation(false);} 
@Html.RadioButtonFor(m => m.MyRadioButton) 
@{Html.EnableClientValidation(true);} 

但是,我有這個問題,想來應該是依賴於其他的要求標籤。我用於解決這個問題的一個解決方案是創建一個正則表達式來刪除我們代碼中的「data-val-required」屬性。 看起來是這樣的:

var radioButton = htmlHelper.RadioButtonFor(*parameters*); 
var requiredAttribute = *check if required attribute was set manually*; 
if (requiredAttribute == null) 
{ 
    Regex regex = new Regex("(data-val-required=\"[a-zA-ZåäöÅÄÖ \\s \\. 0-9]*\")"); 
    radioButton = regex.Replace(radioButton, ""); 
} 

這解決了我的問題,簡單的和通用的方式。