2012-10-05 2 views
1

표준 모델을 사용하는 뷰가 있지만 이제는 페이지의 두 모델에서 정보를 추가해야합니다. 이 문제를 해결하기 위해 연구를 한 후에 ViewModel을 만들었습니다. 이제 내 말을 보여주기 위해 오류가 발생했습니다 :ASP.NET MVC 3 ViewModel 객체의 DataBinder.Eval에서 "속성을 포함하지 않습니다."

DataBinding : 'VirtualAuthtech.ViewModels.CMSCalculatorViewModel'에 'WORKCY'라는 이름의 속성이 없습니다. 여기

내보기에 대한 ActionResult입니다

여기

namespace VirtualAuthtech.ViewModels 
{ 
    public class CMSCalculatorViewModel 
    { 
     public CPT CPT { get; set; } 
     public GPCI GPCI { get; set; } 
    } 
} 

CPT 내가 원래 사용 된 첫 번째 모델 내 뷰 모델이고 그때 GPCI을 추가 할 필요가

여기
public ActionResult _CMSCalculator() 
     { 
      string CPTCode = string.Empty; 
      string MOD = string.Empty; 
      string GPCIPayID = "31146"; 
      string GPCIYear = "2011"; 
      if (Request.Params["CPT1"] != null) 
      { 
       CPTCode = Request.Params["CPT1"]; 
       MOD = Request.Params["MOD"]; 
      } 
      return PartialView("_CMSCalculatorPanel", (string.IsNullOrEmpty(CPTCode) ? null as CMSCalculatorViewModel : CPTDataHelper.GetCPTGPCI(CPTCode, MOD, GPCIPayID, GPCIYear))); 
     } 

입니다 내 모델에서 데이터를 가져 오는 방법

public static CMSCalculatorViewModel GetCPTGPCI(string CPTCode, string MOD, string GPCIPayID, string GPCIYear) 
    { 
     using (var DB = new VADataContext()) 
     { 
      var view = new CMSCalculatorViewModel(); 
      if (String.IsNullOrWhiteSpace(MOD)) 
      { 
       view.CPT = (from cpt in DB.CPTs 
          where cpt.CPT1 == CPTCode 
          select cpt).FirstOrDefault<CPT>(); 
       view.GPCI = (from gpci in DB.GPCIs 
          where gpci.PAYID == GPCIPayID && gpci.YEAR == GPCIYear 
          select gpci).FirstOrDefault<GPCI>(); 
      } 
      else 
      { 
       view.CPT = (from cpt in DB.CPTs 
          where cpt.CPT1 == CPTCode && cpt.MOD == MOD 
          select cpt).FirstOrDefault<CPT>(); 
       view.GPCI = (from gpci in DB.GPCIs 
          where gpci.PAYID == GPCIPayID && gpci.YEAR == GPCIYear 
          select gpci).FirstOrDefault<GPCI>(); 
      } 
      return view; 
     } 
    } 

지금 내보기는 새로운 뷰 모델을 사용하고 난 필드 표시하기 위해 노력하고있어 :

<div style='float:left; width: 35px; margin: 0; padding: 0; text-align: center; color: #094ab2'>@VirtualAuthtech.CallbackPanelHelper.GetFieldNumber(Model, "WORKCY")</div> 

을 그리고 나는이 코드 조각에서 오류를 받고 있어요 : 그것은 말하는

public static double GetFieldNumber(object data, string fieldName) 
     { 
      object text = DataBinder.Eval(data, fieldName); 
      if (text == null || text.ToString() == string.Empty) 
       return 0; 
      double number = Convert.ToDouble(text); 
      return number; 
     } 

내 모델에는 내가 찾는 분야의 속성이 포함되어 있지 않습니다. 내 뷰 모델의 CPT 부분을 보도록 지시해야합니까?

이것은 내가 처음 만든 ViewModel이므로이 모든 잘못을 저지르고있을 수도 있습니다. 올바른 방향으로 나를 보내 주시면 큰 도움이 될 것입니다!

+0

나는 오류가 정확하다고 말할 것이다. 모델 (CMSCalculatorViewModel)에는 CPT와 GPCI의 두 가지 속성이 있으며 둘 다 "작업장"이 아닙니다. –

+0

WORKCY는 CPT 모델의 속성이므로이를 인식하기 위해 변경해야하는 것은 무엇입니까? –

답변

1

왜 GetFieldNumber를 호출합니까?

<div style='float:left; width: 35px; margin: 0; padding: 0; text-align: center; color: #094ab2'>@Model.CPT.WORKCY</div> 

하지만 바인딩 런타임을 사용하는 경우, 어쩌면 함수의 라인이 있어야한다 :

object text = DataBinder.Eval((CMSCalculatorViewModel)data.CPT, fieldName); 
+0

처음부터 null 모델이 될 수 있기 때문에이 작업을 수행 할 수 없습니다. 사용자가 선택에 따라 그리드에서 항목을 선택할 때 필드가 업데이트됩니다. 또한 그 뒤에 논리가 더 많은 분야가 있습니다. –

+0

코드를 업데이트했지만 객체가 NULL로 시작하는 것이 중요하지 않습니다 ... 강하게 입력 된 경우 런타임과 디자인 타임에서 직접 필드를 참조 할 수 있습니다. –

+0

당신의 코드를 시도하고 그것은 null 참조에 런타임 데이터 바인딩을 할 수 없다고 말했다. 나는 작동하는 솔루션을 게시 할 것입니다. 그러나 모든 모델에 대해 내 모델이 null이 아닌지 확인하는 것을 포함하지 않는 경우에는 알려주십시오. –

0

나는 그것을 얻을 수 있었다 다음 줄에 어떤 문제가 될 것입니다 이 코드를 사용하여 작업.

<div style='float:left; width: 35px; margin: 0; padding: 0; text-align: center; color: #094ab2'>@if(Model == null) { <text>0</text> } else { @VirtualAuthtech.CallbackPanelHelper.GetFieldNumber(Model.CPT, "WORKCY") }</div> 

그러나이보기에는 다른 많은 필드가 있습니다. 차라리 모델이 각 모델에 null인지 확인하지 않아도됩니다. 다른 해결책이 있다면 공유하십시오.

+0

좋지만, 새로운, 빈, 빈 모델로 모델링 한 다음 최신 바인딩을 수행 할 필요가 없습니까? –

+0

어쨌든 내가 선택할 것이므로 null로 시작하지 않는 목록의 첫 번째 항목을 사용하기 위해 초기화 된 Model을 계속 진행했습니다. 이제 데이터 바인딩없이 작동합니다. 이것은 이것을하는 훨씬 더 깨끗한 방법처럼 보입니다. 감사. –