我想用C#.Net的Razor Engine复数单词。我正在使用MVC 4.
我有以下内容:
<button class="button light-blue filled compare float-right"
title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"]
market(s)">
Compare
</button>
我不想使用“市场”,而是“市场”或“市场”。
<button class="button light-blue filled compare float-right"
title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"]
@if((int)@Model["NumberOfMarketsThatHaveThisProduct"] == 1)
{
@: market
} else {
@: markets
}">
Compare
</button>
但我觉得这样做并不舒服。
我必须做什么?
答案 0 :(得分:6)
您可以使用逻辑:
market@(someNumber == 1 ? "" : "s")
答案 1 :(得分:4)
更好的方法是创建一个自定义HTML Helper,它将使用.NET 4的PluralizationService(在System.Data.Entity.Design.PluralizationServices
命名空间中引用System.Data.Entity.Design
程序集)正确地进行复数化,这也是EF6用于复数表名。
Razor助手看起来像这样:
namespace CustomHelpers
{
public static class CustomHelpers
{
public static MvcHtmlString Pluralize(this HtmlHelper htmlHelper,
string source)
{
var serv = PluralizationService.CreateService(new System.Globalization.CultureInfo("en-us"));
var plural = serv.Pluralize(source);
return MvcHtmlString.Create(plural);
}
}
}
您可以使用以下语法在Razor中轻松使用此帮助程序:
@using CustomHelpers
<div class="jumbotron">
<h1>Hi @Html.Pluralize("person")</h1>
</div>
您可以想象它会正确地将人多数化为人,市场改为市场以及许多其他字词因为它里面使用了复数字典。这比使用一些自定义复数代码要好得多。
答案 2 :(得分:2)
最“ASP.NET-MVC-esque”方式是使用显示模板:
@model int
@if (Model == 1)
{
@String.Format("{0} market", Model)
}
else
{
@String.Format("{0} markets", Model)
}
将它放在DisplayTemplates文件夹中,并将其命名为“Market.cshtml”。然后,在您的模型中,执行:
[UIHint("Market")]
public int NumberOfMarketsThatHaveThisProduct { get; set; }
在你看来:
@Html.DisplayFor(m => m.NumberOfMarketsThatHaveThisProduct)
通过修改显示模板以便在需要时使用本地资源,可以非常轻松地翻译此方法。
如果您不得不重复这一点,这将比在视图中内联更简洁。如果它是一次性的,你可能会发现它有点过分。
答案 3 :(得分:0)
@
{
string last = Model["NumberOfMarketsThatHaveThisProduct"]==1? "": "'s";
}
<button class="button light-blue filled compare float-right"
title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"] market@last">
Compare
</button>