1

部分ビューのネストについて説明している前の2つの質問を知っていますが、解決策が私のデザインでは機能しません(これは最良の方法ではないかもしれませんが、どのように適応させるかわかりません)。

背景

ユーザーからアンケートの回答を収集し、それらをxmlファイルとしてSQLサーバーに保存します。

特定のユーザーのすべての回答を含むテーブルをロードする部分ビューがあります。この部分ビューには、回答日、xml応答ドキュメントへのリンク、質問表名、xml質問票ドキュメントへのリンクなどがテーブルに入力されます(質問票情報はから取得されます)別のテーブル)と、2つの関連するxmlドキュメントを解析して2番目の部分ビュー内に質問と回答のリストを出力する(つまり、応答を人間が読めるように視覚化する)アクションにリダイレクトするAjaxActionLink。

最初の部分ビューには、テーブルの下にdivが含まれており、Ajax.ActionLinkのクリック時に2番目の部分ビューを入力します。

問題

回答は正しくレンダリングされますが、部分的なビューはスタイル設定なしでまったく新しいページに読み込まれます。

この入れ子の問題に対する他の解決策はRenderPartial()を使用しますが、私はreturn PartialView()を使用します

コード

最初の部分ビュー:

       <table>
        <thead>
         <tr><th>headers with other info</th>
             <th>Display(/th>
         <tr>
        </thead>
        <tbody>
         <tr><td>cells with other info</td>
             <td>@Ajax.ActionLink("View", "DisplayResponse","HealthStatus", new { respID = item.UniqueID,qVersion=item.QuestionnaireVersion, qname = item.QuestionnaireName }, new AjaxOptions { UpdateTargetId = "responseDisp" })</td>
        </tbody> 
       </table>
<div id="responseDisp"></div>    <--- **This is the div I wish to populate, does anyone know why it's not working?**

DisplayResponseアクション(xmlドキュメントを解析するためのロジックなし)

 public ActionResult DisplayResponse(Guid respID, int qVersion, String qname) {
        var allResponses = ZData.Responses;
        var response = (from r in allResponses
                        where r.UniqueID == respID
                        select r
                            ).First();
        //geting an XML questionnaire document
        var questionnaireDetails = ZodiacData.Questionnaires;
        var questionnaire = (from q in questionnaireDetails
                             where q.Name == qname && q.Version == qVersion
                             select q
                            ).First();
        //creating XMLDocument to read the questionnaire
        XmlDocument xqdoc = new XmlDocument();
        xqdoc.LoadXml(questionnaire.Xml);
        XmlElement qroot = xqdoc.DocumentElement;
        ViewBag.qroot = qroot;
        XmlDocument xrdoc = new XmlDocument();
        xrdoc.LoadXml(response.Raw);
        XmlElement rroot = xrdoc.DocumentElement;
        ViewBag.rroot = rroot;

        return PartialView("_PrintedResponse");
    }

助けていただければ幸いです!

4

2 に答える 2

2

MVC3 では、@AJax.ヘルパーは通常のレンダリングformaいくつかの追加data-属性を持つタグをレンダリングします。魔法を機能させるには、この生成されdata-た属性を使用して必要な jQuery ajax 呼び出しを行う Javascript が必要です。

これらの js 関数は に存在するjquery.unobtrusive-ajax.jsため、次の行をレイアウトまたはビューに追加すると機能するはずです。

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" 
        type="text/javascript"></script>
于 2012-07-20T13:09:49.850 に答える
1

まず、前述のように、jquery.unobtrusive-ajax.js ファイルへの参照が必要です。これにより、物事が正しく「配線」されます。

この回答は、モデルをビューに渡す方法についての質問に対するコメントへの回答でもあります。モデルに ViewBag を使用することで、実際には物事をより複雑にしています。

モデルに ViewBag を使用すると、タイプミスの問題や Razor ヘルパーの優れた機能を見つけたり、修正したり、解決したりするのが難しくなります。ViewBag は動的オブジェクトであり、コンパイル時の型チェックはありません。オブジェクトをキャストする必要もありません (少ないコード)。

好ましい (そしてベスト プラクティス) は、次のように接続することです。

1) コントローラーには、ViewModels に渡される ViewModels (厳密に型指定された) が含まれています。

コントローラ

    public ActionResult Something() {
        return View();
    }

    public ActionResult UserView() {
        UserViewModel mdoel = new UserViewModel {
            Email = "me@somewherecool.com",
            FirstName = "Your",
            SStatuses = new List<SStatus>{
                new SStatus {
                    ID = 0
                }
            }
        };
        return PartialView("_SomethingPartial", mdoel);
    }

インデックス (「何か」ビュー)

@{
    ViewBag.Title = "Something";
}

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<h2>Something</h2>
@Ajax.ActionLink("Ajax Click", "UserView", new AjaxOptions { UpdateTargetId = "MyDivContainer", InsertionMode = InsertionMode.Replace })
<div id="MyDivContainer">
<!-- my content should be here -->
</div>

部分図

@model StackModels.UserViewModel
<div class="par">
    @Html.LabelFor(m => m.FirstName)
    <div class="field">
        @Html.TextBoxFor(m => m.FirstName)
        @Html.ValidationMessageFor(m => m.FirstName)
    </div>
</div>
于 2012-07-20T13:31:42.463 に答える