2010-02-02 93 views
3
<p> 
    <label for="Tags">Tags:</label> 
    <% String tagsText = ""; 
     foreach (Tag item in Model.Tags) 
     { 
      tagsText += item.Name + " "; 
     } 
    %> 
    <%= Html.TextBox("Tags", tagsText.Trim()) %> 
    <%= Html.ValidationMessage("Tags", "*") %> 
</p> 

很明顯,這段代碼並不完美,我承認這一點。但是,你會如何改進它?對我來說似乎有點草率。用轉換爲字符串的數據列表填充Html.TextBox

回答

2

不是一個很清潔的東西,但是這有附加的好處,就是不在字符串末尾添加尾隨空格。

<p> 
    <label for="Tags">Tags:</label> 
    <% string tagsText = string.join(" ", (from t in Model.Tags 
              select t.Name).ToArray<string>()); %> 
    <%= Html.TextBox("Tags", tagsText) %> 
    <%= Html.ValidationMessage("Tags", "*") %> 
</p> 
+0

我忘了在我的字符串中包含Trim()方法。更新 – 2010-02-02 06:10:00

+0

這可以寫得更清潔:'String.Join(「」,Model.Tags.Select(t => t.Name).ToArray ())' – roosteronacid 2010-02-02 08:38:51

+0

哇......更好。謝謝roosteronacid – jessegavin 2010-02-02 16:49:27

2

做一個標記表類,增加一個功能:

class TagList 
    inherits List<Of Tag> 

    function ToJoinedString() as string 
     string result = "" 
     foreach t as Tag in Me.List 
      result = t.Name + " " 
     next 
     return result.Trim() 
    end function 

end class 

然後在頁面上:

<p> 
    <label for="Tags">Tags:</label> 
    <%= Html.TextBox("Tags", Model.Tags.ToJoinedString()) %> 
    <%= Html.ValidationMessage("Tags", "*") %> 
</p> 

這具有在其他地方使用的優勢。

1

使用類似的擴展方法如下:

public static class StringExtensions 
{ 
    public static string Join(this List<string> values, char separator) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     for (int i = 0; i < values.Count; i++) 
     { 
      string value = values[i]; 
      stringBuilder.Append(value); 

      if (i < (values.Count - 1)) 
      { 
       stringBuilder.Append(separator); 
      } 
     } 

     return stringBuilder.ToString(); 
    } 
} 

你可以做這樣一個電話:

<%@ Import Namespace="YourExtensionsNamespaceHere" %> 
<%= Html.TextBox("Tags", tagsText.Join(' ')) %> 

您可以通過使用一個StringBuilder在一定的增益(非常)小的性能提升的其他字符串操作選項。