8

目標

C#.NetのRazor Engineで単語を複数形にしたい。MVC4を使用しています。

問題

私は次のものを持っています:

<button class="button light-blue filled compare float-right" 
 title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"]
   market(s)">
   Compare
</button>

"market(s)" は使いたくありませんが、はい "market" または "markets" です。

私がすでに試したこと

<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>

しかし、私はそれをするのが快適ではありません。

私がしなければならないこと?

4

4 に答える 4

8

ロジックを使用できます:

market@(someNumber == 1 ? "" : "s")
于 2013-06-13T18:51:10.213 に答える
5

はるかに優れた方法は、.NET 4 のPluralizationService (System.Data.Entity.Design.PluralizationServices名前空間内 - アセンブリを参照) を使用して複数形化を正しく行うカスタム HTML ヘルパーを作成することです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>

ご想像のとおり、内部で複数形辞書を使用しているため、 Person to PeopleMarket to Markets 、および他の多くの単語を正しく複数形にできます。これは、カスタムの複数形化コードを使用するよりもはるかに優れています。

于 2014-10-01T16:27:32.187 に答える
2

最も「ASP.NET-MVC 風」な方法は、表示テンプレートを使用することです。

@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)

このアプローチは、必要に応じてローカル リソースを使用するように表示テンプレートを変更することで、非常に簡単に変換できます。

これを何度も繰り返さなければならない場合、これはビュー内でインラインで行うよりもすっきりします。1回限りの場合、やり過ぎだと感じるかもしれません。

于 2013-06-13T19:05:17.560 に答える
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>
于 2013-06-13T18:55:47.167 に答える