在C#中硬编码Html的替代方案?

时间:2010-08-30 21:43:06

标签: c# html

我发现自己将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;
    }

3 个答案:

答案 0 :(得分:1)

看一下将HTML指定为模板并在运行时通过模板变量替换内容。有关使用T4或XSLT的一些想法,请参阅此帖子:C# template engine

答案 1 :(得分:1)

根据您访问HTML的原因,以下内容可以帮助降低硬编码的程度,或者至少将其放在更易于管理的地方:

  1. 主 - 页面。
  2. 用户控件。
  3. 资源。
  4. 使用XmlWriter编写XHTML。
  5. 使用XmlWriter(或其他方式)编写XML,然后使用XSLT进行处理(无论是在服务器还是客户端)。
  6. 值得注意的是,如果您使用母版页,则可以更改C#中使用的母版页。同样,用户控件可以动态加载(可能作为以编程方式选择的控件加载的控件)。

答案 2 :(得分:0)

  

现在,我有一些片段   整个硬编码的HTML   用户界面。它通常是导航html,   但并非总是如此。

如果您使用的是Asp.Net,答案可能是使用Master Pages

任何形式的特殊代码组都应该封装在User Control中。