2010-02-02 42 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在一定的增益(非常)小的性能提升的其他字符串操作选项。

相关问题