使用 Sitecore().Field() 格式化 Sitecore 日期?
Format Sitecore Date using Sitecore().Field()?
我需要为日期使用自定义格式(即 dddd dd MMMM yyyy
)。是否可以将此格式传递给 Sitecore().Field()
?我想做这样的事情:
@Html.Sitecore().Field("Day1", new { @format="dddd dd MMMM yyyy"})
但是,在谷歌搜索之后,我发现我要么必须创建一个自定义字段助手来执行此操作,要么必须创建一个自定义模型。使用基本 Sitecore 真的没有办法做到这一点吗?通过 Sitecore().Field()
完成此操作很重要,因为我需要内容编辑器才能编辑值。
我们使用的是 Sitecore 7.5
据我所知,Sitecore 没有开箱即用的功能。
您可以使用帮助程序来实现此功能,请检查以下代码。
我使用了这段代码并且工作正常。您也可以从页面编辑器编辑日期字段,因为该字段是通过 Sitecore 管道编辑的。
public static class Helper
{
public static HtmlString RenderField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
if (parameters == null)
{
parameters = new SC.Collections.SafeDictionary<string>();
}
return sitecoreHelper.Field(
fieldNameOrId,
new
{
DisableWebEdit = disableWebEdit,
Parameters = parameters
});
}
public static HtmlString RenderField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
return RenderField(
sitecoreHelper,
fieldId.ToString(),
disableWebEdit,
parameters);
}
public static HtmlString RenderDate(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
string format = "D",
bool disableWebEdit = false,
bool setCulture = true,
SC.Collections.SafeDictionary<string> parameters = null)
{
if (setCulture)
{
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(SC.Context.Language.Name);
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(SC.Context.Language.Name);
}
if (parameters == null)
{
parameters = new SC.Collections.SafeDictionary<string>();
}
parameters["format"] = format;
return RenderField(
sitecoreHelper,
fieldNameOrId,
disableWebEdit,
parameters);
}
public static HtmlString RenderDate(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
string format = "D",
bool disableWebEdit = false,
bool setCulture = true,
SC.Collections.SafeDictionary<string> parameters = null)
{
return RenderDate(
sitecoreHelper,
fieldId.ToString(),
format,
disableWebEdit,
setCulture,
parameters);
}
public static HtmlString TagField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
string htmlElement,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
SC.Data.Items.Item item =
SC.Mvc.Presentation.RenderingContext.Current.ContextItem;
if (item == null || String.IsNullOrEmpty(item[fieldNameOrId]))
{
return new HtmlString(String.Empty);
}
string value = sitecoreHelper.RenderField(
fieldNameOrId,
disableWebEdit,
parameters).ToString();
return new HtmlString(String.Format(
"<{0}>{1}</{0}>",
htmlElement,
value));
}
public static HtmlString TagField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
string htmlElement,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
return TagField(
sitecoreHelper,
fieldId.ToString(),
htmlElement,
disableWebEdit,
parameters);
}
}
在您的 cshtml 中,您将拥有:
@Html.Sitecore().RenderDate("Name of field or id", "your format")
John West 在此处写下如何扩展 sitecore 助手:
http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/06/sitecore-mvc-playground-part-4-extending-the-sitecorehelper-class.aspx
我修改了@SitecoreClimber 的答案,因为它使用默认值 RenderingContext.Current
,因此无法渲染子项目
所以我更新了每个方法参数并添加了 Item item
并将该项目用于基场渲染,如下所示:
public static HtmlString RenderField(this SitecoreHelper sitecoreHelper, string fieldNameOrId, Item item, bool disableWebEdit = false, SafeDictionary<string> parameters = null)
{
if (parameters == null)
{
parameters = new SafeDictionary<string>();
}
return sitecoreHelper.Field(fieldNameOrId, item,
new
{
DisableWebEdit = disableWebEdit,
Parameters = parameters
});
}
所以在我的 MVC 视图中,我现在可以拥有:
@foreach (Item item in @Model.Item.Children)
{
<div class="event-date">
@Html.Sitecore().RenderDate("Date", item, "d MMM")
</div>
}
您可以使用下面的字段渲染语法来格式化日期,这很简单而且开箱即用。
@Html.Sitecore().Field("Date Field", new {format="MMM dd, yyyy"})
就是这样。格式值利用了 standard date format specifications.
对于那些在处理空格时遇到问题的人,只需将所有空格替换为“\n”即可。
这里有一个例子:
@Html.Sitecore().Field(datefield, new {format="MMM\ndd,\nyyyy"})
我需要为日期使用自定义格式(即 dddd dd MMMM yyyy
)。是否可以将此格式传递给 Sitecore().Field()
?我想做这样的事情:
@Html.Sitecore().Field("Day1", new { @format="dddd dd MMMM yyyy"})
但是,在谷歌搜索之后,我发现我要么必须创建一个自定义字段助手来执行此操作,要么必须创建一个自定义模型。使用基本 Sitecore 真的没有办法做到这一点吗?通过 Sitecore().Field()
完成此操作很重要,因为我需要内容编辑器才能编辑值。
我们使用的是 Sitecore 7.5
据我所知,Sitecore 没有开箱即用的功能。 您可以使用帮助程序来实现此功能,请检查以下代码。 我使用了这段代码并且工作正常。您也可以从页面编辑器编辑日期字段,因为该字段是通过 Sitecore 管道编辑的。
public static class Helper
{
public static HtmlString RenderField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
if (parameters == null)
{
parameters = new SC.Collections.SafeDictionary<string>();
}
return sitecoreHelper.Field(
fieldNameOrId,
new
{
DisableWebEdit = disableWebEdit,
Parameters = parameters
});
}
public static HtmlString RenderField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
return RenderField(
sitecoreHelper,
fieldId.ToString(),
disableWebEdit,
parameters);
}
public static HtmlString RenderDate(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
string format = "D",
bool disableWebEdit = false,
bool setCulture = true,
SC.Collections.SafeDictionary<string> parameters = null)
{
if (setCulture)
{
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(SC.Context.Language.Name);
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(SC.Context.Language.Name);
}
if (parameters == null)
{
parameters = new SC.Collections.SafeDictionary<string>();
}
parameters["format"] = format;
return RenderField(
sitecoreHelper,
fieldNameOrId,
disableWebEdit,
parameters);
}
public static HtmlString RenderDate(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
string format = "D",
bool disableWebEdit = false,
bool setCulture = true,
SC.Collections.SafeDictionary<string> parameters = null)
{
return RenderDate(
sitecoreHelper,
fieldId.ToString(),
format,
disableWebEdit,
setCulture,
parameters);
}
public static HtmlString TagField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
string fieldNameOrId,
string htmlElement,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
SC.Data.Items.Item item =
SC.Mvc.Presentation.RenderingContext.Current.ContextItem;
if (item == null || String.IsNullOrEmpty(item[fieldNameOrId]))
{
return new HtmlString(String.Empty);
}
string value = sitecoreHelper.RenderField(
fieldNameOrId,
disableWebEdit,
parameters).ToString();
return new HtmlString(String.Format(
"<{0}>{1}</{0}>",
htmlElement,
value));
}
public static HtmlString TagField(
this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
SC.Data.ID fieldId,
string htmlElement,
bool disableWebEdit = false,
SC.Collections.SafeDictionary<string> parameters = null)
{
return TagField(
sitecoreHelper,
fieldId.ToString(),
htmlElement,
disableWebEdit,
parameters);
}
}
在您的 cshtml 中,您将拥有:
@Html.Sitecore().RenderDate("Name of field or id", "your format")
John West 在此处写下如何扩展 sitecore 助手: http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/06/sitecore-mvc-playground-part-4-extending-the-sitecorehelper-class.aspx
我修改了@SitecoreClimber 的答案,因为它使用默认值 RenderingContext.Current
所以我更新了每个方法参数并添加了 Item item
并将该项目用于基场渲染,如下所示:
public static HtmlString RenderField(this SitecoreHelper sitecoreHelper, string fieldNameOrId, Item item, bool disableWebEdit = false, SafeDictionary<string> parameters = null)
{
if (parameters == null)
{
parameters = new SafeDictionary<string>();
}
return sitecoreHelper.Field(fieldNameOrId, item,
new
{
DisableWebEdit = disableWebEdit,
Parameters = parameters
});
}
所以在我的 MVC 视图中,我现在可以拥有:
@foreach (Item item in @Model.Item.Children)
{
<div class="event-date">
@Html.Sitecore().RenderDate("Date", item, "d MMM")
</div>
}
您可以使用下面的字段渲染语法来格式化日期,这很简单而且开箱即用。
@Html.Sitecore().Field("Date Field", new {format="MMM dd, yyyy"})
就是这样。格式值利用了 standard date format specifications.
对于那些在处理空格时遇到问题的人,只需将所有空格替换为“\n”即可。
这里有一个例子:
@Html.Sitecore().Field(datefield, new {format="MMM\ndd,\nyyyy"})