【发布时间】:2010-08-30 21:43:05
【问题描述】:
我发现自己将 html 硬编码到 C# 中。它通常在数据驱动的页面上。页面内容和 url 改变,但物理页面没有改变。就目前而言,我在整个 UI 中散布了硬编码 HTML 的 sn-ps。它通常是导航 html,但并非总是如此。
在大多数情况下,html 周围都有逻辑。一个示例将选择当前选项卡。
感觉很脏——一定有更优雅的解决方案。
也许使用设置文件?数据库?数据库似乎有点矫枉过正,并添加了一些没有价值的抽象层,至少在我的应用程序中是这样。
更新
我提供了两种示例方法。该应用程序是在 ASP.NET MVC 2 框架上编写的。
示例一:
/// <summary>
/// Gets the album sub navigation.
/// </summary>
/// <returns></returns>
public string GetAlbumSubNavigation()
{
StringBuilder builder = new StringBuilder();
IDictionary<string, string> links = new Dictionary<string, string>
{
{"all", @"<li><a {2} href=""/{0}/albums/addphotos/{1}"">All</a></li>"},
{"bytags", @"<li><a {2} href=""/{0}/albums/tags/{1}"">Tags</a></li>"},
{"bysearching", @"<li><a {2} href=""/{0}/albums/searchphotos/{1}"">Search</a></li>"}
};
builder.AppendLine(@"<ul style=""text-align: right; margin-bottom: 40px;"" class=""hyperlinks"" id=""subviewlinks"">");
foreach (KeyValuePair<string, string> keyValuePair in links)
{
string youarehere = (string.Equals(PartialViewName, keyValuePair.Key,
StringComparison.InvariantCultureIgnoreCase)
? "class=\"youarehere\""
: string.Empty);
builder.AppendLine(string.Format(keyValuePair.Value, Authorization.Owner.Username, Album.AlbumId,
youarehere));
}
builder.AppendLine(@"</ul>");
return builder.ToString();
}
例子二:
/// <summary>
/// Gets the photo detail links.
/// </summary>
/// <param name="media">The media.</param>
/// <param name="isAuthenticated">if set to <c>true</c> [is authenticated].</param>
/// <returns></returns>
public static string GetPhotoDetailLinks(Media media, bool isAuthenticated)
{
IUserUrlService userUrlService = GetUserUrlService();
ITagService tagService = DependencyInjection.Resolve<ITagService>();
const string perminateLinkFormat = @"<li><a href=""{0}"" title=""{1}"" >permalink</a></li>";
string perminateLink = string.Format(perminateLinkFormat, userUrlService.UserUrl(media.Owner.Username, "photos/show/" + media.MediaId), media.Title);
string html = @"<ul>
<li>
<span>";
html += (isAuthenticated ? @"<a id=""editlink"" href=""{0}/photos/edit/{1}"">edit</a>" : string.Empty);
html += @"</span>
</li>";
html += "{2}";
html += @"
</li>
{3}
{5}
<li><span><a href=""{0}/comments/leave/{1}"">comments ({4})</a></span>
</ul>";
string tags = string.Empty;
if (!string.IsNullOrEmpty(media.Tags))
{
const string tagFormat = @"<li><span>tags:</span> {0}</li>";
string renderedTags = tagService.HyperlinkTheTags(media.Tags, media.Owner.Username);
tags = string.Format(tagFormat, renderedTags);
}
string date = GetDate(media);
string content = string.Format(html, userUrlService.UserRoot(media.Owner.Username), HttpUtility.HtmlEncode(media.MediaId.ToString()), date, tags, media.CommentCount, perminateLink);
return content;
}
【问题讨论】:
-
ASP.NET? MVC?还有什么?
-
我赞同奥斯卡的评论。您能否发布一些您认为必须有更好方法的示例代码?
-
@Oskar, @Lunchaguate 我已经发布了一些方法。
-
@Steve 它是用 ASP.NET MVC 编写的。