用转换为字符串的数据列表填充Html.TextBox
问题描述:
<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
答
不是一个很清洁的东西,但是这有附加的好处,就是不在字符串末尾添加尾随空格。
<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>
答
做一个标记表类,增加一个功能:
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>
这具有在其他地方使用的优势。
答
使用类似的扩展方法如下:
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在一定的增益(非常)小的性能提升的其他字符串操作选项。
我忘了在我的字符串中包含Trim()方法。更新 – 2010-02-02 06:10:00
这可以写得更清洁:'String.Join(“”,Model.Tags.Select(t => t.Name).ToArray())' –
roosteronacid
2010-02-02 08:38:51
哇......更好。谢谢roosteronacid – jessegavin 2010-02-02 16:49:27