我发现自己将html硬编码到C#中。它通常在数据驱动的页面上。页面和网址的内容会发生变化,但物理页面不会更改。就目前而言,我在整个用户界面中都有硬编码的HTML片段。它通常是导航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;
}
答案 0 :(得分:1)
看一下将HTML指定为模板并在运行时通过模板变量替换内容。有关使用T4或XSLT的一些想法,请参阅此帖子:C# template engine。
答案 1 :(得分:1)
根据您访问HTML的原因,以下内容可以帮助降低硬编码的程度,或者至少将其放在更易于管理的地方:
值得注意的是,如果您使用母版页,则可以更改C#中使用的母版页。同样,用户控件可以动态加载(可能作为以编程方式选择的控件加载的控件)。
答案 2 :(得分:0)
现在,我有一些片段 整个硬编码的HTML 用户界面。它通常是导航html, 但并非总是如此。
如果您使用的是Asp.Net,答案可能是使用Master Pages。
任何形式的特殊代码组都应该封装在User Control中。