私は次のような価格を計算しようとしています:
@{
Model.Prices.total =
((Input == choice) ? a : b)
+
((AnotherInput == anotherchoice) ? c : d)
;
}
これはビューファイル内でうまく機能し.cshtml
ますが、言うまでもなく、実際のコードはかなり長くなります(3つのそのような異なる計算を適用したいことは言うまでもありません)。
そこで、次のように呼び出すことができるように、 in呼び出しで@helper
ファイルを作成することを考えました。App_Code
Calculate
Pricing.cshtml
@Pricing.Calculate()
ただし、これにより「null参照に対してランタイムバインディングを実行できません」というエラーがスローされます。
エラーが発生しますが、それが制限です。誰かが私がこれを達成するためにどのように行くことができるかを提案できますか?私はクラスファイルについて考えましたが、それを1つに変換する方法がわかりません(それがより良い代替手段である場合)。コードサンプルは非常に高く評価されています。
更新: 私が調査した他のオプションに変換できないため、この計算を一時的にビューに配置していました:
- ファイル内の
@helper
関数App_Code
-しかし、これは私が遭遇した「null参照」エラーです。 - クラスファイル(または単にViewModelに追加する
.cs
だけですが、コーディングを正しく行うことができません。 - それをコントローラーに入れるという提案-しかし、コードは長いです。
カスタムHtmlHelperクラスを作成して、 `@ Html.Calculate([parameter?]、[parameter?])のように呼び出しますが、私にとっては、#2よりも少し複雑です。-コメントはきちんと記されています。
繰り返しになりますが、私が提供した例は、必要最低限の単純なものであることに注意してください。複数のオプション(たとえば、上記のa
「s」と「」)を使用してそれぞれを探索するための30以上の条件があり、それらのいくつかはより複雑になります。b
() ? a : () ? b : c + () ? d : () ? e : () ? f : g + ....
そして、C#コード(独自の.cs
ファイル、カスタムHtmlヘルパー、またはViewModelのいずれか)を使用すると、間違っているのはすべての宣言です。
念のために言っておきますが、これは私が問題を抱えている実際の計算ではありません。すぐ上のそのスニペットは、私の計算を実行するために機能します。私はそれを上にリストした適切なオプションに到達させるのに苦労しています。
更新2
これを独自のクラスに変換するのに多くの問題があります(私はプログラマーではありません-理解できず申し訳ありません)。これはビュー内の私の関数の一部です(単なるスニペットです。コードサンプルを提供すれば、残りの部分を理解できるといいのですが):
@{
Model.Price.calculated
=
//below is the "base" price, all else would be "add-ons"
Model.Price.priceOne //elsewhere would be priceTwo, etc.
+
((Model.MyModelOne.MyRadioButtonOne ==
MyModelOne.RB1Enum.RB1ChoiceOne)
?
Model.Price.AddOnOne
:
(Model.MyModelOne.MyRadioButtonOne ==
MyModelOne.RB1Enum.RB1ChoiceTwo)
?
Model.Price.AddOnTwo
:
Model.Price.AddOnThree)
+
((Model.MyModelTwo.MyRadioButtonTwo
== MyModelTwo.RB2Enum.RB2ChoiceOne)
?
Model.Price.AddOnFour
:
(Model.MyModelTwo.MyRadioButtonTwo
== MyModelTwo.RB2Enum.RB2ChoiceTwo)
?
Model.Price.AddOnFive
:
Model.Price.AddOnSix)
;
}
を使用するために私のボールをバストしないでくださいenums
。:)
繰り返しになりますが、計算はビューで行うのに適切なことではありませんが、上記は機能します-ユーザーの選択に基づいて期待する計算結果が得られます。
私のPrice.cs
モデル(ここでも、基本的なものなので、アイデアが得られます):
public class Price
{
//Leaving out [DataType] and [DisplayFormat] DataAnnotations
// leaving out priceTwo, etc.
// numbers are basic for simplicity
public decimal calculated { get; set; }
public decimal priceOne { get { return 100; } }
public decimal AddOnTwo { get { return 10; } }
public decimal AddOnThree { get { return 20; } }
public decimal AddOnFour { get { return 30; } }
public decimal AddOnFive { get { return 40; } }
public decimal AddOnSix { get { return 50; } }
// Others go here
}