2012-07-23 41 views
0

因此,我正在处理一个MVC 3项目,该项目从多个(10)表中将旧数据源提取到具有6个部分的主视图。有一张表有每个子视图的数据,因此我们决定将它存储在会话数据中,然后用其他任何需要的数据填充其余的子视图。将会话数据保存到子视图MVC 3

当我们最初尝试这样做时,我们得到了会话数据的空引用异常。我提出了一个解决方案,但它看起来很笨重,我不认为这是最好的做法/引入不必要的状态。

相关代码如下:

这就是我们的主控制器上:

public ActionResult PolicyView(string PolicyID) 
    { 
     IPolicyHolder phdata = new PolicyHolderData(); 
     Polmast policy = phdata.GetPolicyFromUV(PolicyID); 
     ViewBag.FullName = policy.FULLNAME; 
     ViewBag.PolicyID = PolicyID; 
     Session["polmast"] = policy; 
     return View("PolicyView"); 
    } 

然后在我们的主要观点,链接到部分子画面之一:

<div id="Billing"> 
@{ Html.RenderAction("Billing", Session["polmast"]); } 
</div> 

在子控制器:

public ActionResult Billing(object sessiondata) 
    { 
     return PartialView("_Billing", sessiondata); 
    } 

而在子视图:

@{var polmast = (Polmast)Session["polmast"];} 
**snip** 

<table id="premiumsgrid" class="display" border="1" 
cellpadding="0" cellspacing="0" width="50%"> 
<thead> 
    <tr> 
     <th>Annual</th> 
     <th>Semi-Annual</th> 
     <th>Quarterly</th> 
     <th>Monthly</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td>@polmast.PAN</td> 
     <td>@polmast.PSA</td> 
     <td>@polmast.PQT</td> 
     <td>@polmast.PMO</td> 
    </tr> 

</tbody> 
</table> 

回答

2

我会建议开始使用的模型和返回那些大家的意见,而不是绕过会话对象和您的视图中铸造它。这将使这个代码更干净。

这是我会怎么构建我的代码:

public ActionResult PolicyView(string PolicyID) 
    { 
     IPolicyHolder phdata = new PolicyHolderData(); 
     Polmast policy = phdata.GetPolicyFromUV(PolicyID); 

     PolicyModel model = new PoliceModel() { 
      FullName = policy.FULLNAME, 
      PolicyID = PolicyID 
      //Populate other properties here. 
     }; 

     Session["polmast"] = policy; 

     return View("PolicyView", model); 
    } 

然后我会设置您的主视图(有没有需要包装在大括号这个电话,你不应该需要通过任何途径值):

<div id="Billing"> 
    @Html.RenderAction("Billing") 
</div> 

孩子控制器:

public ActionResult Billing() 
    { 
     //Get the data out of session; it should already exist since your parent controller took care of it. 
     var policyData = (Polmast)Session["polmast"]; 

     PolicyModel model = new PoliceModel() { 
      FullName = policy.FULLNAME, 
      PolicyID = PolicyID 
      //Populate other properties here. 
     }; 

     return PartialView("_Billing", model); 
    } 

和您的孩子的看法:

@model Polmast 剪断

<table id="premiumsgrid" class="display" border="1" 
cellpadding="0" cellspacing="0" width="50%"> 
<thead> 
    <tr> 
     <th>Annual</th> 
     <th>Semi-Annual</th> 
     <th>Quarterly</th> 
     <th>Monthly</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td>@Model.PAN</td> 
     <td>@Model.PSA</td> 
     <td>@Model.PQT</td> 
     <td>@Model.PMO</td> 
    </tr> 

</tbody> 
</table> 
+0

是是是。请将您的视图绑定到模型。这正是MVC应该做的。我也会避免在会话中存储实际的对象。如果你可以将它转换为一个字符串,或者只存储一些int来标识所涉及的实体将更清洁。 – 2012-07-23 20:24:34

+0

我的解决方案是沿着这些路线。我为通过会话数据的子项创建了viewModels,插入了特定于视图的数据,然后传递给它。 – 2012-07-26 16:49:15