2012-05-18 40 views
2

我想計算的價格,是這樣的:將函數放入@helper時爲空引用 - 我可以在哪放置它或如何處理它?

@{ 
    Model.Prices.total = 
     ((Input == choice) ? a : b) 
    + 
     ((AnotherInput == anotherchoice) ? c : d) 
    ; 
} 

這行之有效的.cshtml視圖文件中,但不用說實際的代碼是很長時間(更不用提,我想申請3這種不同的計算)。

所以我開始做一個@helper文件App_CodePricing.cshtml所謂Calculate,我可以把它像這樣的思路:

@Pricing.Calculate() 

但是,這將拋出一個「不能爲空引用執行運行時綁定「錯誤。

我得到的錯誤,我得到這是一個限制。任何人都可以建議我如何去完成這個?我想到了一個類文件,但不知道如何將它轉換爲一個類(如果這是一個更好的選擇)。代碼示例非常感謝。

UPDATE: 我暫時把這個計算的觀點,因爲我無法將其轉換爲我研究過其他的選擇:

  1. App_Code文件的@helper功能 - 但這是我遇到的「空引用」錯誤。
  2. 一個.cs類文件(或者只是把它添加到我的視圖模型 - 但我不能得到編碼權
  3. 的建議,把它的控制器 - 但代碼冗長
  4. 創建自定義。 HTML輔助類來嘗試並調用它像`@ Html.Calculate([參數?],[參數]) - 。但對我來說這是更復雜一點比#2 - 評適當注意

。再一次請注意,我提供的例子是一個簡單的例子,我有30多個條件來探索每個選項(a的和b的上面,例如),其中有些變得更加複雜:

() ? a :() ? b : c +() ? d :() ? e :() ? f : g + .... 

如果我去的C#代碼(無論是在它自己的.cs文件,自定義HTML輔助或視圖模型)這是所有我將會弄錯的聲明。

請注意,這不是我遇到問題時的實際計算。上面的代碼片段直接用來執行我的計算。 我只是努力使它達到我上面列出的適當選項。

我有很多的麻煩此轉換成它自己的類UPDATE(我不是一個程序員 - 對不起,不理解)。這是我在視圖功能的一部分(只是一個片段,希望我能找出休息,如果你提供一個代碼示例):

@{ 
    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 
} 
+0

執行計算以設置模型聽起來像不屬於視圖的東西。你有需要它的原因嗎? – DMulligan

+0

不,我希望它在一個單獨的文件中,就像'App_Code'中的函數/幫助器一樣。我想過創建一個班,但不知道如何。 – REMESQ

+0

我認爲@AFinkelstein的意思是這個邏輯應該在你的控制器上。 – ivowiblo

回答

1

的HTML幫助功能,只是方式重用你的顯示器的重複片段。你現在正在做的是基於模型狀態的計算。在MVC中,這種數據處理將被視爲模型的一部分。

這是我要採取的基本步驟。

  1. 取/創建您的業務模型,其中包含執行此計算所需的所有信息。
  2. 對商業模型進行計算。如果您的計算基於一個僅使用其內部屬性的對象,則可以將計算代碼包含在您的業務模型本身中。否則,我會創建一個計算它的單獨計算類。
  3. 根據計算結果和您的業務模型創建您的視圖模型。視圖模型應該只包含將在視圖中顯示/編輯的狀態。

例如:

public ActionResult YourAction(int userChoice) 
{ 
    MyModel businessModel = createOrFetchModel(); //May be more than one object 
    Calculations calcs = new Calculations(businessModel); 
    var total = calcs.GetTotal(userChoice); 
    MyViewModel viewModel = makeViewModel; //usually I'd use something like AutoMapper here 
    return View(viewModel); 
} 

編輯:基於您的更新示例代碼。您必須根據實際計算確定最終設計。

public class Calculations 
{ 
    MyModelOne modelOne; //Do you really need seperate models for radio buttons? 
    MyModelTwo modelTwo; 
    Price Price; 

    //... 

    public decimal GetTotal() 
    { 
     decimal total = price.priceOne; 
     total += price.FirstAddOn(modelOne); 
     total += price.SecondAddOn(modelTwo); 
     return total; 
    } 
} 

public class Price 
{ 
    //... 
    public decimal FirstAddOn(MyModelOne modelOne) 
    { 
     if(modelOne.MyRadioButtonOne == MyModelOne.RB1Enum.RB1ChoiceOne) 
      return this.AddOnOne; 
     else if(modelOne.MyRadioButtonOne == MyModelOne.RB1Enum.RB1ChoiceTwo) 
      return this.AddOnTwo; 
     else 
     return this.AddOnThree; 
    } 
} 
+0

啊,我明白你的意思了。好吧,但現在有麻煩簡單地轉換我的視圖功能類。我在我的問題中添加了更新#2以提供更多我正在做的事情的代碼。再次感謝您的幫助。 – REMESQ

+0

這看起來很棒。謝謝。給我一點點來測試一下。順便說一句,我有100個實體,所以我將它們分開放在不同的模型中。我只是舉了一個我正在做的事情的例子。我有4個不同的視圖模型,每個視圖模型僅從我擁有的10-12個模型中選擇所需的模型(然後僅從每個模型中拉出所需的實體)。 – REMESQ

相關問題