2011-07-13 17 views
0

ユーザにパッケージオプションのリストを提示する必要があります。ラジオボタンリストを使用したくないのですが、リスト項目ごとにかなり複雑なテンプレートが必要です。私を許してください。しかし、ラジオボタンの列をビューモデルの選択プロパティにリンクする方法を理解できないようです。ラジオボタンを使用してMVC3のリスト項目を選択する方法

私のビューモデルは、SelectedPackageId(int)と、個々のパッケージを表すMemberPackageListItemビューモデルのリストを持っています。 MemberPackageListItemにはPackageId(int)が含まれているので、選択した項目のPackageIdをルートビューモデルのSelectedPackageIdに結合する必要があります。

継承などがあなたが見たいものの多くを隠しているので、コードを投稿することは難しいので、私はかなり一般的なシナリオの概要を願っています。この中でラジオボタンを使用する際の一般的なガイドラインシナリオを続けるだけで十分です。

答えて

1

:(レイザー構文)次のように使用法があります完全に不器用なjQueryソリューション。セレクタはより具体的かもしれませんが、今は必要ありません。私の解決策は以下の通りです。ラジオ・タイプの入力は、各行ごとに異なる索引が付いた名前属性によってグループ化されます。したがって、その行が選択されている場合は、jQueryまたはDOMプロパティではないことを示す行ごとに、IsSelectedプロパティが表示されます。

2

私は次のように、あなたのラジオボタンリストをレンダリングするためのHtmlHelperを使用することをお勧めします:

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 
    public static MvcHtmlString RadioButtonListFor<TModel, TList, TSelectedItem>(
     this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TList>> expression, 
     Expression<Func<TModel, TSelectedItem>> selectedItem) 
    { 
     return RadioButtonListFor(htmlHelper, expression, selectedItem, null /* htmlAttributes */); 
    } 

    [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 
    public static MvcHtmlString RadioButtonListFor<TModel, TList, TSelectedItem>(
     this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TList>> expression, 
     Expression<Func<TModel, TSelectedItem>> selectedItem, object htmlAttributes) 
    { 
     return RadioButtonListFor(htmlHelper, expression, selectedItem, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
    } 

    [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 
    public static MvcHtmlString RadioButtonListFor<TModel, TList, TSelectedItem>(
     this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TList>> expression, 
     Expression<Func<TModel, TSelectedItem>> selectedItem, IDictionary<string, object> htmlAttributes) 
    { 
     if (expression == null) 
     { 
      throw new ArgumentNullException("expression"); 
     } 

     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     IEnumerable<SelectListItem> items = null; 
     if (metadata.Model != null) 
     { 
      IEnumerable<SelectListItem> modelItems = (IEnumerable<SelectListItem>)metadata.Model; 
      if (modelItems != null) 
      { 
       items = modelItems; 
      } 
     } 

     ModelMetadata selectedItemMetadata = ModelMetadata.FromLambdaExpression(selectedItem, htmlHelper.ViewData); 

     return RadioButtonListHelper(htmlHelper, metadata, selectedItemMetadata, ExpressionHelper.GetExpressionText(selectedItem), items, htmlAttributes); 
    } 

    private static MvcHtmlString RadioButtonListHelper(HtmlHelper htmlHelper, ModelMetadata metadata, 
     ModelMetadata selectedItemMetadata, string name, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes) 
    { 
     // Verify arguments 
     if (String.IsNullOrEmpty(name)) throw new ArgumentNullException("name", "Name cannot be null"); 
     if (selectList == null) throw new ArgumentNullException("selectList", "Select list cannot be null"); 
     if (selectList.Count() < 1) throw new ArgumentException("Select list must contain at least one value", "selectList"); 

     string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
     string fullId = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix + "_" + name; 

     IDictionary<string, object> validationAttributes = htmlHelper 
      .GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(name), selectedItemMetadata); 

     // Define items 
     StringBuilder items = new StringBuilder(); 

     // Loop through items 
     Int32 index = 0; 
     foreach (SelectListItem i in selectList) 
     { 

      // Define check box input 
      TagBuilder input = new TagBuilder("input"); 
      input.MergeAttribute("type", "radio"); 
      input.MergeAttribute("name", fullName, true); 
      if (i.Selected) 
       input.MergeAttribute("checked", "checked"); 
      input.MergeAttribute("value", i.Value); 
      if (index == 0) 
       input.MergeAttributes(validationAttributes); 
      input.MergeAttributes(htmlAttributes); 

      // Define label 
      TagBuilder label = new TagBuilder("label"); 
      label.MergeAttribute("for", fullId + "[" + index.ToString() + "].Selected"); 
      label.InnerHtml = i.Text; 

      // Add item 
      items.AppendFormat("\r\t<div>\r\t\t{0}\r\t\t{1}\r\t</div>", 
       input.ToString(TagRenderMode.Normal), 
       label.ToString(TagRenderMode.Normal)); 

      index++; 
     } 
     // Return list 
     return new MvcHtmlString(items.ToString() + "\r"); 
    } 

MemberPackageListItemはタイプIEnumerable<SelectListItem>でなければならないことに注意してください。

@Html.RadioButtonListFor(m => m.MemberPackageListItem, m => m.SelectedPackageId) 

counsellorben私は@ counsellorbenの答えの技術的な包括性を感謝し、将来の使用のために周りにそれを維持しますが、今日私はより迅速かつないに到着

関連する問題