5

メール テンプレートに Handlebars .NET を使用しているため、サーバー側幅の ASP.NET MVC でテンプレートを生成します。このような比較が必要です。でも効かない?私に何ができる?

//Product.ProdType is a enum property 

{{#if (Product.ProdType=='BlaBlaBla')}}
<p>This is a test</p>
{{/if}}
4

4 に答える 4

8

同じ問題があり、数値データ型と文字列で機能するヘルパー関数「ifCond」を作成しました。他のタイプで動作するように最適化または拡張できます。

Handlebars.RegisterHelper("ifCond",
        (writer, context, args) =>
        {
            if (args.Length != 5)
            {
                writer.Write("ifCond:Wrong number of arguments");
                return;
            }

            if (args[0] == null || args[0].GetType().Name == "UndefinedBindingResult")
            {
                writer.Write("ifCond:args[0] undefined");
                return;
            }
            if (args[1] == null || args[1].GetType().Name == "UndefinedBindingResult")
            {
                writer.Write("ifCond:args[1] undefined");
                return;
            }
            if (args[2] == null || args[2].GetType().Name == "UndefinedBindingResult")
            {
                writer.Write("ifCond:args[2] undefined");
                return;
            }

            if (args[0].GetType().Name == "String")
            {
                string val1 = args[0].ToString();
                string val2 = args[2].ToString();

                switch (args[1].ToString())
                {
                    case ">":
                        writer.Write(val1.Length > val2.Length ? args[3] : args[4]);
                        break;
                    case "=":
                    case "==":
                        writer.Write(val1 == val2 ? args[3] : args[4]);
                        break;
                    case "<":
                        writer.Write(val1.Length < val2.Length ? args[3] : args[4]);
                        break;
                    case "!=":
                    case "<>":
                        writer.Write(val1 != val2 ? args[3] : args[4]);
                        break;
                }
            }
            else
            {
                float val1 = float.Parse(args[0].ToString());
                float val2 = float.Parse(args[2].ToString());

                switch (args[1].ToString())
                {
                    case ">":
                        writer.Write(val1 > val2 ? args[3] : args[4]);
                        break;
                    case "=":
                    case "==":
                        writer.Write(val1 == val2 ? args[3] : args[4]);
                        break;
                    case "<":
                        writer.Write(val1 < val2 ? args[3] : args[4]);
                        break;
                    case "<=":
                        writer.Write(val1 <= val2 ? args[3] : args[4]);
                        break;
                    case ">=":
                        writer.Write(val1 >= val2 ? args[3] : args[4]);
                        break;
                    case "!=":
                    case "<>":
                        writer.Write(val1 != val2 ? args[3] : args[4]);
                        break;
                }
            }

そして、ここに使用法を説明するいくつかのユニットテストがあります:

var template = Handlebars.Compile("{{{ifCond test '>' 1 '>1' '<=1' }}}");
var data = new { test = 2 };
var result = template(data);
Assert.AreEqual(">1", result);

data = new { test = 0 };
result = template(data);
Assert.AreEqual("<=1", result);

template = Handlebars.Compile("{{{ifCond test '=' 1 'eq' 'not eq' }}}");
data = new { test = 1 };
result = template(data);
Assert.AreEqual("eq", result);

data = new { test = 0 };
result = template(data);
Assert.AreEqual("not eq", result);

template = Handlebars.Compile("{{{ifCond test '!=' 1 'diff' 'eq' }}}");
data = new { test = 2 };
result = template(data);
Assert.AreEqual("diff", result);

template = Handlebars.Compile("{{{ifCond str '!=' '' 'not empty' 'empty' }}}");
var datastr = new { str = "abc" };
result = template(datastr);
Assert.AreEqual("not empty", result);

template = Handlebars.Compile("{{{ifCond str '==' '' 'empty' 'not empty' }}}");
datastr = new { str = "" };
result = template(datastr);
Assert.AreEqual("empty", result);

それが役立つことを願っています。また、より良い実装、よりエレガントなソリューションを望んでいますが、私のソリューションはより簡潔な方法で実行できると思います。

テンプレート内に Int32 値を使用した使用例を次に示します。

{{ifCond MycountVariable '>' 1 'more than one' 'one'}}

テンプレート内に String 値を使用した使用例を次に示します。

{{ifCond MyStringVariable '!=' '' MyStringVariable 'empty value'}}
于 2016-04-06T12:37:55.460 に答える
1

あなたがやろうとしているようなロジックは、ヘルパー関数にある必要があります。そのような関係演算子をハンドルバー テンプレートに直接入れることはできません。意図的にそのように設計されています。ヘルパーは非常に簡単に作成して使用できます。詳細については、 http://handlebarsjs.com/#helpersを参照してください。

hbs.registerHelper("IsSame", function(ProdType) {
 if(ProdType == "BlaBlaBla") {
   $('#HereText').append('<p>This is a test</p>');
    }
});

テンプレートでこれを行う

<div class="row">
   {{IsSame Product.ProdType}}
</div>

ここでは、値をヘルパー関数に渡し、比較を行っています..

于 2015-06-19T09:09:36.603 に答える