0

私は3つのテーブルを持っています:

RateProfile

  • RateProfileID
  • プロファイル名

レート

  • RateID
  • RateProfileID
  • PanelID
  • 更新する他のもの

パネル

  • PanelID
  • PanelName

これらのそれぞれのモデルがあります。RateProfileモデルを使用した編集ページがあります。RateProfileの情報と、それに関連付けられているすべてのレートを表示します。これは正常に機能し、正常に更新できます。ただし、PanelIDでレートをフィルタリングできるように、ドロップダウンも追加しました。フィルタリングされたレートを表示できるように、変更をポストバックする必要があります。

使っています

@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })

私のドロップダウンリストのために。ただし、HttpPost Editメソッドにポストバックするときはいつでも、Ratesナビゲーションプロパティに関するすべての情報が欠落しているようです。フォームにある入力/送信ボタンとまったく同じように機能すると思ったので、奇妙です(実際には、モデル全体がHttpPost Editアクションに戻され、必要な処理が実行されます)。panelIDはHttpPostEditメソッドに適切に渡され、次のビューに渡されますが、Model.Ratesナビゲーションプロパティをクエリしようとするとnullになります(投稿がドロップダウンからのものである場合のみ。投稿がからのものである場合はすべて正常に機能します私の送信入力)。

編集する:

    public ActionResult Edit(int id, int panelID = 1)
    {

        RateProfile rateprofile = db.RateProfiles.Single(r => r.RateProfileID == id);
        var panels = db.Panels;

        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;

        return View(rateprofile);
    }

HttpPost編集:

    [HttpPost]
    public ActionResult Edit(RateProfile rateprofile, int panelID)
    {
        var panels = db.Panels;
        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;
        if (ModelState.IsValid)
        {
            db.Entry(rateprofile).State = EntityState.Modified;

            foreach (Rate dimerate in rateprofile.Rates)
            {
                db.Entry(dimerate).State = EntityState.Modified;
            }
            db.SaveChanges();
            return View(rateprofile);
        }
        return View(rateprofile);
    }

意見:

@model  PDR.Models.RateProfile
@using (Html.BeginForm(null,null,FormMethod.Post, new {id="RateForm"}))
{
    <div>
        @Html.Label("Panel")
        @Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
    </div>
    @{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
    @for (int i = 0; i < rates.Count; i++)
        {
            <tr>
                <td>
                    @Html.HiddenFor(modelItem => rates[i].RateProfileID)
                    @Html.HiddenFor(modelItem => rates[i].RateID)
                    @Html.HiddenFor(modelItem => rates[i].PanelID)

                    @Html.EditorFor(modelItem => rates[i].minCount)
                    @Html.ValidationMessageFor(model => rates[i].minCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].maxCount)
                    @Html.ValidationMessageFor(model => rates[i].maxCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].Amount)
                    @Html.ValidationMessageFor(model => rates[i].Amount)
                </td>
            </tr>
        }
     <input type="submit" value="Save" />
}

私の問題を要約すると、私のビューでの以下のクエリは、投稿が送信ボタンからのものであり、ドロップダウンリストからのものではない場合にのみ機能します。

@{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
4

3 に答える 3

0

問題が見つかりました。ナビゲーション プロパティ (panelID でフィルタリングされた料金) のサブセットのみをループしていたため、ビューから返されたモデルには、そのナビゲーション プロパティのサブセットしか使用できなかったようです。変更を保存した後、モデルを再定義し (データベースからレコードを再度呼び出しました)、見栄えがよくなりました。

すなわち。私のナビゲーション プロパティには 140 レコードあるはずでしたが、panelID == 1 でフィルタリングすると 28 レコードに絞り込まれました。なんらかの理由で、エンティティ フレームワークは、他の 112 レコードとの関係を維持する気がないと判断したため、ドロップダウンを変更して panelID == 2 でフィルター処理すると、利用可能な唯一のレコードはすべて panelID == 1 を持ち、null を返しました。 .

于 2012-06-25T17:19:12.873 に答える
0

Firefox/Firebug を使用して、実際に行われているリクエストを調べることをお勧めします。送信とボタンを介してトリガーされた場合、フォームの投稿が異なるとは想像できませんが、可能だと思います。

より大きなメモとして、私はあなたのデザインについていくつかのコメントをしたいと思います.

  1. ViewData へのキーベースのアクセスではなく、ViewBag プロパティを使用して選択します。これにより、コントローラーとビューの両方ではるかに読みやすくなります。

  2. ドロップダウン リストによってフィルター処理された情報を入力する別のアクションを用意することを検討してください。PanelID に基づいてビューでそのアクションをレンダリングし、AJAX を介してそのアクションを呼び出して、完全なフォームの投稿を行うのではなく、新しい HTML を取得します。

  3. マークアップにハンドラーを適用することは避けてください。代わりに、オプションの [スクリプト] セクションをマスター ページに追加し、必要に応じて、そのセクションを通じて動作を適用するスクリプトをページに追加します。これにより、ビュー固有のスクリプトがドキュメントに配置される場所をマスター経由で制御し、ドキュメント構造からビヘイビアーを切り離すことができます。これは、読みやすさのベスト プラクティスです。

于 2012-06-24T15:27:58.247 に答える
0

レンダリングされたページでどのように表示されますか? 同じ名前/ID でレンダリングされる 2 つの要素がある場合があります。

 @Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()"

@Html.HiddenFor(modelItem => rates[i].PanelID)
于 2012-06-24T15:25:58.920 に答える