2012-10-05 36 views
1

我有一个使用标准模型的视图,但现在我需要在页面上添加来自两个不同模型的信息。在做了一些研究来处理这个问题之后,我创建了一个ViewModel。现在我收到一个错误,当显示我的观点时说:ASP.NET MVC 3 ViewModel对象上的DataBinder.Eval抛出“不包含属性”

DataBinding:'VirtualAuthtech.ViewModels.CMSCalculatorViewModel'不包含名称为'WORKCY'的属性。

这里是我的视图模型

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

CPT是我原来用的是第一种模式,然后我需要添加GPCI

这里是我的看法的ActionResult的

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,两者都不命名为“WORKCY”。 –

+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

我不能这样做,因为它将是一个空模型开始。当用户根据他的选择从网格中选择一个项目时,该字段会更新。还有更多的领域也会有逻辑背后的逻辑。 –

+0

我更新了代码,但是应该没有问题,对象是NULL开始...只要它是强类型的,你可以在设计时和运行时直接引用这些字段。 –

+0

我试过你的代码,它说我无法将运行时数据绑定到空引用。我会发布一个可行的解决方案,但如果你得到一个不涉及确保我的模型对于每个领域都不为空的解决方案,请让我知道。 –

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> 

但是,我在这个视图中有很多其他领域。我宁愿不必检查它们中的每一个模型是否为空。如果您有其他解决方案,请分享。

+0

看起来不错,但为什么不设置你的模型到一个新的,空的,空的模型,然后你不必做后期绑定? –

+0

我继续初始化Model以使用列表中的第一个项目,它将选择它,因此它不会以null开始。现在它的工作没有数据绑定。这似乎是一个更干净的方式来做到这一点。谢谢。 –