【问题标题】:Replacing content in Razor selectively选择性地替换 Razor 中的内容
【发布时间】:2012-10-19 17:45:25
【问题描述】:

是否可以在 Razor 中做这样的事情:

@using(Html.CMSContent("TermsOfService")) 
{
    <text>
        <!-- Some default content goes here if the "TermsOfService"
             item doesn't exist in my content table in the database -->
    </text>
}

在处理视图时,如果 CMSContent 助手在我设置的某个数据库表中没有找到名为“TermsOfService”的内容项,它将输出默认内容。

否则,它会将默认内容替换为数据库中的内容?

我正在尝试构建一个 CMS/应用程序混合体,以便营销部门可以根据需要覆盖我的应用程序中的文本。

澄清

我这样做的原因是为了让代码超级容易阅读和编写。我最终会在所有地方使用这些小内容块,因此我希望尽量减少开发人员为获得此功能而必须输入的数量。

我还期望 99% 的时间会显示默认文本。但我希望处理 1% 的情况,我们需要快速更改一些文本而无需重新部署应用程序。因此,让默认文本尽可能接近其上下文很重要(即,我不希望开发人员必须跳转到不同的文件来查看默认文本是什么 - 也不必跳转到顶部页)。

例如,当您执行@using(Html.BeginForm()) 时,它会自动发出开始和结束&lt;form&gt; 标记。我希望有这样聪明的东西。

【问题讨论】:

  • 有什么理由不把这个逻辑放到控制器里?
  • 只是想让默认内容尽可能接近页面的上下文。阅读 Razor 视图并查看默认文本以了解页面的外观比跳转到控制器更容易。

标签: asp.net-mvc razor content-management-system


【解决方案1】:

Html.CMSContent("..") 返回什么?您能否将此帮助程序的返回值存储到变量中,然后检查调用是否返回数据库值,如果是则显示内容,否则显示默认文本?这是我所描述的一些快速代码,不确定它是否在您的情况下 100% 有效,因为您没有指定您的助手返回的内容

 @{
      var terms = Html.CMSContent("TermsOfService");
 }

 @if (terms != null && terms != "") {
      @terms
 } else {
      @: Default Terms of Service
 }

【讨论】:

  • 抱歉不清楚。 CMSContent 函数的主体(或粗略的草图)是我所要求的 - 它现在不存在。
【解决方案2】:

我想我知道我在找什么了。它使用if 而不是using

if(!Html.CMSContent("TermsOfService"))
{
     <text>
           Default content goes here
     </text>
}

对于助手:

public static bool CMSContent(this HtmlHelper Html, string BlockName)
{
     if (blockname in database)
     {
         var blockdata = (retrieve from database);
         Html.ViewContext.HttpContext.Response.Write(blockdata);
         return true;
     }
     else
     {
         return false;
     }

}

虽然我不确定使用 Response.Write 是不是最好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2019-03-16
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    相关资源
    最近更新 更多