0

そのため、レガシーデータソースから6つのパーシャルを持つマスタービューに複数のテーブルからプルするMVC3プロジェクトに取り組んでいます。すべての子ビューのデータを含むテーブルが1つあるため、それをセッションデータに保存してから、残りの子ビューに必要な他のデータを入力することにしました。

最初にこれを実行しようとしたとき、セッションデータへのnull参照例外が発生していました。私は解決策を考え出しましたが、それは非常に不格好なようで、ベストプラクティス/不要な状態の導入ではないと思います。

従うべき関連コード:

これは、メインコントローラーにあるものです。

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");
    }

次に、メインビューで、部分的な子ビューへのリンクの1つを示します。

<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>
4

1 に答える 1

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 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>@Model.PAN</td>
        <td>@Model.PSA</td>
        <td>@Model.PQT</td>
        <td>@Model.PMO</td>
    </tr>

</tbody>
</table>
于 2012-07-23T18:03:44.113 に答える