2011-03-31 3 views
1

MVC에서 HtmlHelpers를 사용하여 매우 유용한 기능을 제공하며 이제는 드롭 다운을 만들려고합니다. 모델을 전달할 때 어떤 것을 기반으로합니다. 속성은 값과 텍스트의 동일 속성입니다.사용자 지정 HtmlHelper를 사용하여 모델에서 ASP.NET MVC 사용자 지정 드롭 다운

그래서 나는이 같은 있습니다

public static MvcHtmlString DataFilledDropDown<T>(this HtmlHelper h, string name, T selectedValue) 
    { 
     var myModel = typeof(T); 
     var dropDownBox = new Tag("select").With("name", name).And("id", name); 

     foreach (T val in Enum.GetValues(myModel)) 
     { 
      var itemText = Resources.ResourceManager.GetString(val.ToString()); 
      if (String.IsNullOrEmpty(itemText)) itemText = val.ToString(); 

      var dft = new Tag("option") 
       .With("value", "0") 
       .AndIf(val.Equals(selectedValue), "selected", "selected") 
       .WithText("-- CHOOSE --"); 
      dropDownBox.Append(dft); 

      var option = new Tag("option") 
       .With("value", (val).ToString()) 
       .AndIf(val.Equals(selectedValue), "selected", "selected") 
       .WithText(itemText); 
      dropDownBox.Append(option); 
     } 
     return MvcHtmlString.Create(dropDownBox.ToString()); 

    } 

을하지만 이것은 단지 하나의 필드에 저를 포함 것이다 그러나 나의 모델은 다음과 같이 될 수있다 :

그래서 다음 만들려는 이상과
public class TestModel{ 
    public int Id {get; set; } // this i want as a value in dropdown 
    public string Name {get;set;} // this i want to be the text value in dropdown 
    public bool isActive { get; set; } // this i dont need in dropdown but have data in model 
} 

Html.DataFilledDropDown<myModel>("TestDropdown","Id","Name","0") 

여기서 입력은 드롭 다운의 이름, 값 p의 이름입니다.

public static MvcHtmlString DataFilledDropDown<T>(
     this HtmlHelper h, string name, IEnumerable<T> items, 
     Func<T,string> valueField, Func<T,string> textField, string selectedValue) 
    { 
     var dropDownBox = new Tag("select").With("name", name).And("id", name); 
     var defaultValue = "0"; 
     var dft = new Tag("option") 
       .With("value", "0") 
       .AndIf(defaultValue.Equals(selectedValue), "selected", "selected") 
       .WithText("-- CHOOSE --"); 
     dropDownBox.Append(dft); 

     foreach (var item in items) 
     { 
      var myValue = valueField(item); 
      var myName = textField(item); 

      var option = new Tag("option") 
       .With("value", myValue) 
       .AndIf(myValue.Equals(selectedValue), "selected", "selected") 
       .WithText(myName); 
      dropDownBox.Append(option); 

     } 

     return MvcHtmlString.Create(dropDownBox.ToString()); 
    } 

하고 코드를 실행 : roperty, 텍스트 속성과 나는 아래의 대답에서 약간의 도움이 완료

기본 선택 값의 이름은이에 관심있는 사람들을위한 코드입니다

<%: Html.DataFilledDropDown("SpexOptionType", Model.Clubs, x => x.clubID.ToString(), x => x.clubName, "0")%> 

그게 전부

많은 감사

+1

당신이 대답을 받아 들여야한다. –

+1

'태그'클래스의 코드를 게시 할 수 있습니까? 도서관에서 온거야? 감사합니다 – SzilardD

+0

"태그"개체가 존재하지 않는다고 생각합니다 - 확실히 MVC3 내에 존재하지 않습니다 ..... –

답변

1

나는이 질문에 직접 대답하지 않는다는 것을 알고 있지만, 나는 당신이 당신의 이름과 ID를 위해 문자열을 사용하지 말 것을 제안한다. 문제가 많고 시간이 지남에 따라 유지하기가 어렵습니다. 대신 Func을 사용하십시오.

는 여기에 내가 선택 목록에 사용하는 작업은 다음과 같습니다

public static string SelectList<T>(this HtmlHelper html, T root, IEnumerable<T> items, Func<T, string> itemValueContent, 
          Func<T, string> itemTextContent, Func<T, IEnumerable<T>> childrenProperty, Func<T, string> parentProperty, string selectSize) 
    { 
     StringBuilder parentSb = new StringBuilder(); 
     StringBuilder childSb = new StringBuilder(); 

     parentSb.AppendFormat("<select class='parent' name='parent' size='{0}'>\r\n", selectSize); 
     childSb.AppendFormat("<select class='child' id='child' size='{0}'>\r\n", selectSize); 

     foreach (T parentItem in items) 
     { 
      foreach (T item in childrenProperty(parentItem)) 
      { 
       RenderParentOption(parentSb, item, itemValueContent, itemTextContent); 

       foreach (T item1 in childrenProperty(item)) 
       { 
        RenderOptionWithClass(childSb, item1, itemValueContent, itemTextContent, parentProperty); 
       } 
      }     
     } 



     parentSb.AppendLine("</select>"); 
     childSb.AppendLine("</select>"); 


     return parentSb.ToString() + childSb.ToString(); 
    } 


    private static void RenderOptionWithClass<T>(StringBuilder sb, T item, Func<T, string> itemValueContent, Func<T, string> itemTextContent, Func<T, string> parentProperty) 
    { 
     sb.AppendFormat("<option class='sub_{2}' value='{0}'>{1}</option>\r\n", itemValueContent(item), itemTextContent(item), parentProperty(item)); 
    } 

    private static void RenderParentOption<T>(StringBuilder sb, T item, Func<T, string> itemValueContent, Func<T, string> itemTextContent) 
    { 
     sb.AppendFormat("<option value='{0}'>{1}</option>\r\n", itemValueContent(item), itemTextContent(item) + " ->"); 
    } 

이 그것이 사용되는 방법이다 : 당신이 당신의 문제를 해결하기 위해 그 충분 경우

<%=Html.SelectList<HierarchyNode<CategoryModel>>(Model.CategoryList.First(), Model.CategoryList, 
     x => x.Entity.RowId.ToString(), 
     x => x.Entity.Name.ToString(), 
     x => x.ChildNodes, 
     x => x.Entity.ParentCategoryId.ToString(), "10")%> 
+0

감사합니다. 나는 당신이 2 개의 드롭 다운 목록을 작성하는 것처럼 보일지 모르겠다. Func <>에 대한 노트를 가져 와서 이것을 사용하여 지금 실제로 작동하도록 내 버전을 수정 했으므로 팁을 주셔서 감사합니다. 당신이보고 싶다면 솔루션을 보여주기 위해 내 게시물을 수정했습니다. ta – davethecoder

+0

죄송합니다.이 코드는 중첩 목록이있는 트리 뷰를 만듭니다. 작동시키기 위해 도움이 필요하면 다시 게시하십시오. – rboarman

관련 문제