2012-05-18 2 views
2

나는 가격을 계산하기 위해 노력하고, 뭔가 같은 :@helper에 함수를 넣을 때 Null 참조 - 어디에 넣을 수 있습니까? 아니면 어떻게 처리 할 수 ​​있습니까?

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

이것은 .cshtml보기 파일 내에서 잘 작동하지만, 불필요한 실제 코드는 LOT (나는 3을 적용 할 것을 말할 것도없고 더 이상 말을 그러한 다른 계산들).

그래서 나는 다음과 같이 호출 할 수 있도록 Pricing.cshtmlCalculate라는 App_Code@helper 파일 만들기의 생각에 도착 :

@Pricing.Calculate() 

을 그러나 이것은이 "null 참조에 바인딩 런타임을 수행 할 수 없습니다 발생합니다 "오류.

나는 오류가 발생하며 그 한계가 있습니다. 아무도 내가 이것을 성취 할 수있는 방법을 제안 할 수 있습니까? 나는 클래스 파일에 대해 생각했지만 하나 (더 나은 대안이라면)로 변환하는 방법을 모른다. 코드 샘플은 매우 높이 평가됩니다.

업데이트 : 내가 연구 한 다른 옵션으로 변환 할 수없는이기 때문에 내가보기에 일시적으로이 계산을 배치했다 :

  1. App_Code 파일에 @helper 기능 -을하지만이있다 내가 만난 "null 참조"오류가 발생했습니다.
  2. .cs 클래스 파일 (또는 어쩌면 그냥 내 뷰 모델에 추가 -하지만 난 코딩 권리를 얻을 수
  3. 제안을 컨트롤러에 넣어 -.하지만 코드가 긴입니다
  4. 사용자 정의 만들기. HTML을 도우미 시도하고 ([매개 변수?], [매개 변수?])`@ Html.Calculate과 같이 호출하는 클래스 -.하지만 나를 위해 그 # 2보다 조금 더 복잡 은 - 정식 의견을 언급

. 다시 한 번 말하지만 내가 제공 한 예제는 단순한 것입니다. 여러 가지 옵션으로 각각을 탐색 할 수있는 30 가지 이상의 조건이 있습니다 (a 's 및 b'의 예를 들어 위의), 그리고 그들 중 일부는 더 복잡해 :

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

을 그리고 나는 그것이 자신의 .cs 파일 중 하나 (C# 코드를 이동하는 경우, 사용자 정의 HTML을 도우미 또는 뷰 모델에) 내가 잘못하려고하는 것은 모두 선언입니다.

당신에게 문제가있는 것은 실제 계산이 아닙니다. 위의 스 니펫이 계산을 수행하기 위해 작동합니다. 나는 위에 열거 된 적절한 옵션을 얻기 위해 고심하고있다.

내가 자신의 클래스에이 변환 문제가 많이 데 2

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. 계산 결과와 비즈니스 모델을 기반으로 View 모델을 만듭니다. 뷰 모델에는 뷰 내에 표시/편집 될 상태 만 포함되어야합니다. 예를 들어

:

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

이것은 굉장합니다. 감사. 그것을 시험해보기 위해 조금만주세요. BTW, 100 개의 엔티티가 있으므로 별도의 모델에서 논리적으로 분리합니다. 나는 단지 내가 한 일의 예를 보여주고 있었다. 필자는 4 가지 별개의 뷰 모델을 가지고 있는데, 각각은 필자가 가지고있는 10-12 개의 모델 중 필요한 모델 만 선택합니다 (그리고 각 모델에서 필요한 엔티티 만 가져옵니다). – REMESQ

관련 문제