2012-03-14 52 views
1

我想有條件地計算一些基於表單中用戶輸入的值。 「輸入」本身與計算相關,因爲如果用戶出現兩個單選按鈕列表,他們的選擇將決定是否附加貨幣數量,然後再將它們相加。我不明白jquery,所以我無法弄清楚如何使用knockout.js這樣的東西來做我想做的事情(除此之外,我的計算只會在確認視圖中提供,除非重新計算),除非用戶返回並更改他們的選擇)。請注意,我不是在談論這種場景,其中有一個接受值並將其添加到用戶輸入的另一個文本框值的文本框(例如,用戶輸入10,然後是10,然後是表格計算20)。這些值基於選擇是靜態的。MVC4有條件的積分

對於上下文,我使用Serializer和一個嚮導來逐步完成並將模型選擇/輸入傳遞給後續視圖。

我可以做這樣的事情爲例(這很簡單,但基於回答,我可以想出如何建立起來的較爲複雜的情況我有):

Model.cs:

[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}")] 
public decimal calculated { get; set; } 

[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}")] 
public decimal option1 = 500; 

[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}")] 
public decimal option2 = 100; 

//Following is just my idea to calculate $0 if 
//a selection results in a "no value option" 
//although I suppose if nothing is selected I 
//can just avoid calculating + $0 
[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}")] 
public decimal nooption = 0; 

然後在Confirm.cshtml:

@{ 
    Model.calculated = Model.option1 + Model.option2 + Model.nooption; 
} 
.... 
@Html.DisplayFor(m => m.calculated) 

將顯示$600.00。這很簡單。

但是,我的目標是三倍第一個,我需要配合,例如,option1與選擇從單選按鈕列表和option2與另一個單選按鈕列表取決於用戶選擇。 第二個,根據選擇我想有條件地計算出所有選項的存在,這將顯然會根據用戶選擇而變化(某些用戶將選擇option1option2,其他僅爲option1,其他僅爲option2,其他人都不)。 第三,其中是計算髮生的最佳位置(視圖,.cs文件,控制器(儘管我試圖最小化代碼)等)。

所以,如果我有這些枚舉的單選按鈕列表(相當於現在的選擇的每個選項,我將在稍後討論每個單選按鈕列表枚舉兩個選項):

public enum radio1 
{ 
    radio1selection1, // this would correspond to nooption (or $0) 
    radio1selection2 // this would correspond to option1 (or $500) 
} 
public enum radio2 
{ 
    radio2selection1, // this would correspond to nooption (or $0) 
    radio2selection2 // this would correspond to option2 (or $100) 
} 

我的指示enums我想如何將選項「綁定」到選擇。

我的問題是在試圖做if陳述,我無法弄清楚。 Confirm.cshtml

@{ 
    if (Model.radio1 == radio1selection1) 
     Model.calculated = Model.nooption; 
    else.... 
} 

上面是完全錯誤的,我知道。我試圖想到所有的計算排列,但我認爲它不值得這樣做,因爲它可能是錯誤的,或者它會起作用,但是當有一種更簡單的方法時它會過長。我甚至想過嘗試case/break,但這看起來奇怪的是錯誤的方法。

什麼是增加了對我的複雜性,如果我的enums有兩個以上的選擇,而那些其他選擇導致幾個選項,說option1option1a,並根據其用戶選擇將決定計算。因此,枚舉變爲:

public enum radio1 
{ 
    radio1selection1, // this would correspond to nooption (or $0) 
    radio1selection2, // this would correspond to option1 (or $500) 
    radio1selection3 // this would correspond to NEW 
         // option1a (or $750) (with a corresponding 
         // "int" named "option1a") 
} 

一個我認爲這樣做是爲了只顯示在視圖中的<table>選擇了所有選項,這樣即使事情是$ 0的值,它只是說$ 0的東西作爲選項。然後我想我可以添加所有的值。但我仍然不知道實現這一目標的最佳方法。

關於我如何能夠和/或所有三個我上面陳述的目標的任何意見?

回答

0

我想通了,如何做到這一點(可能不乾淨/高效/標準做法,但它得到了這份工作完成):

Model.calculated = 
     Model.PriceQuote.priceChapter7Solution + 
     ((Model.radiobuttonlist1 == 
      Namespace.ViewModels.MyModel.radio1.radio1selection1) ? 
     Model.option1 : 
     (Model.radiobuttonlist1 == 
      Namespace.ViewModels.MyModel.radio1.radio1selection2) ? 
     Model.option2 : 
     Model.nooption); 

我只能... : Model.nooption);添加+而不會終止語句的CAL制定其他選擇的條件。

最初我不知道條件(? :)操作符可能包含兩個以上的表達式 - 即它是正確的關聯,所以附加條件將被評估爲a ? b : (c ? d : e)。見Docs

1

如下我定義屬性:

[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}")] 
public decimal calculated { get { return option1 + option2 + option3; } } 

您可以進行邏輯條件的getter中必要的。我認爲模型是這些計算的最佳位置,這是我們通過計算得到的屬性得出的結果。

要呈現的選項的集合,它們定義如下:

public class MyOption 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

List<MyOptions> options = new List<MyOptions>(); 
options.Add(new MyOption { ID = "1", Name = "First" }); 

model.Options = options; 

你可以有一個方法,而不是返回的基於期權*屬性的數據選項列表中選擇屬性。

然後在一些輔助方法中將其轉換爲SelectList對象。一個HTML輔助函數可以被定義如下:

public static class MyHelperExtensions 
{ 
    public static SelectList MyOptionList(this HtmlHelper helper, List<MyOptions> options) 
    { 
     return new SelectList(options, "ID", "Name"); 
    } 
} 

在視圖中,使用下面的代碼來渲染選項:

@Html.DropDownListFor(x => x.MyOptionProperty, Html.MyOptionList(Model.Options)) 
+0

我不想用下拉菜單來渲染選項。根據主要表格中的選擇,我創建了一個確認頁面。確認頁面然後將列出(以表格形式)那些僅被選擇的選項,然後總計它們。因此,如果用戶選擇了option1和option2,那麼確認頁面將分別列出500美元和100美元,然後「Total」行將計算option1 + option2並顯示600美元。 – REMESQ 2012-03-16 21:11:28

+0

但是我可以看到吸氣劑是如何工作的,它不是1 + 2 +3的靜態計算,它可以是1,1 + 2,1 + 3,2,2 + 3,3。你明白了。 – REMESQ 2012-03-16 21:19:23