【问题标题】:An alternative to hardcoding Html in C#?在 C# 中硬编码 Html 的替代方法?
【发布时间】: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 编写的。

标签: c# html


【解决方案1】:

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

【讨论】:

  • +1 这看起来很有趣。它更符合我的要求。
【解决方案2】:

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

  1. 母版页。
  2. 用户控件。
  3. 资源。
  4. 使用 XmlWriter 编写 XHTML。
  5. 使用 XmlWriter(或其他方式)编写 XML,然后使用 XSLT 进行处理(无论是在服务器上还是客户端上)。

值得注意的是,如果您使用母版页,您可以从 C# 更改使用哪个母版页。同样,用户控件可以动态加载(可能作为加载到以编程方式选择的控件中的控件)。

【讨论】:

  • 资源可能有用...我对 XML 不感兴趣。它正在用另一个问题代替一个问题......它是 ASP.NET MVC,所以没有控件。
【解决方案3】:

就目前而言,我有 sn-ps 硬编码的 HTML 遍布各处 用户界面。通常是导航html, 但并非总是如此。

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

任何出现在各处的特殊代码组都应封装到User Control

【讨论】:

  • 它们已被封装并集中在 C# 类中......我必须考虑用户控件。那可能行得通。我正在考虑更多类似于字符串 MVC-esk 模板引擎的东西,我不知道这样的事情是否存在。
  • 我的回答比 MVC 更适合网络表单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多