0

このプロジェクトに取り組んでいますが、私は再び立ち往生しています。横にメニューを表示する必要があるというビューがあります。メニューはテーブルから引き出されます。これと並行して、別のテーブルから引き出された質問があります。この中には、別のテーブルからまだ引き出された提案があります。質問には、いくつかの入力、ラジオ ボタン、フィードバック用のテキスト ボックスがあり、最終的に別のテーブルに表示されます。これはすべて、メイン テーブルの ID を使用して実行する必要があります。これにより、情報が結果テーブルに保存されるときに、それが属するメイン レコードもわかるようになります。ページは /Audit/302 で表示できますが、サブメニューを次の質問に変更すると、その質問を取得して ID を維持するにはどうすればよいですか。質問ごとに、その ID のエントリがあります。私は関係を築いてきました。 関係

2011 年 8 月 2 日

Score というテーブルからチェックボックスのリストを取得する ViewModel を追加しました (OK、懸念、N/A)

私が持っているページは、AuditSchedules からレコードを取得し、いくつかの情報を取得する ID でレンダリングされます。レイアウトには、さまざまなセクションと MainQuestion (部分) を選択するアクションリンクのリストをレンダリングするサイド メニュー (部分) もあります。ここまで作業します。ビューモデルを追加してチェックボックスを設定し、AuditSchedule と MainQuestion の ID を使用してテキストをテーブルに保存したためです。私の問題は、スコアのテーブルから ID を選択するために ID を呼び出しており、AuditSchedule から ID を取得していることです。データが見つかりません。これが私のコントローラーです:

        //get
    public ActionResult _Forms(int score)
    {
        AuditFormEdit viewModel = new AuditFormEdit();
        viewModel.ScoreInstance = _db.Scores.Single(r => r.ScoreID == score);
        viewModel.InitializeScoreCheckBoxHelperList(_db.Scores.ToList());
        return View(viewModel);
    }

    //post
    [HttpPost]
    public ActionResult _Forms(int score, AuditFormEdit viewModel)
    {
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToScores();
            _db.Entry(viewModel.ScoreInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("/");
        }
        else
        {
            return View(viewModel);
        }
    }

ここに私のビューモデルがあります:

    public class AuditFormEdit
{
    public Models.Score ScoreInstance { get; set; }

    public List<ScoreCardCheckBoxHelper> ScoreCardCheckBoxHelperList { get; set; }

    public void InitializeScoreCheckBoxHelperList(List<Models.Score> ScoreList)
    {
        if (this.ScoreCardCheckBoxHelperList == null)
            this.ScoreCardCheckBoxHelperList = new List<ScoreCardCheckBoxHelper>();

        if (ScoreList != null
            && this.ScoreInstance != null)
        {
            this.ScoreCardCheckBoxHelperList.Clear();
            ScoreCardCheckBoxHelper spacerProductCheckBoxHelper;
            string spacerTypes =
                string.IsNullOrEmpty(this.ScoreInstance.ScoreName) ?
                string.Empty : this.ScoreInstance.ScoreName;
            foreach (Models.Score scoreType in ScoreList)
            {
                spacerProductCheckBoxHelper = new ScoreCardCheckBoxHelper(scoreType);
                if (spacerTypes.Contains(scoreType.ScoreName))
                    spacerProductCheckBoxHelper.Checked = true;
                this.ScoreCardCheckBoxHelperList.Add(spacerProductCheckBoxHelper);
            }
        }
    }

    public void PopulateCheckBoxsToScores()
    {
        this.ScoreInstance.ScoreName = string.Empty;
        var scoreType = this.ScoreCardCheckBoxHelperList.Where(x => x.Checked)
                              .Select<ScoreCardCheckBoxHelper, string>(x => x.ScoreName)
                              .AsEnumerable();
        this.ScoreInstance.ScoreName = string.Join(", ", scoreType);
    }


    public class ScoreCardCheckBoxHelper : Models.Score
    {
        public bool Checked { get; set; }

        public ScoreCardCheckBoxHelper() : base() { }

        public ScoreCardCheckBoxHelper(Models.Score scoreCard)
        {
            this.ScoreID = scoreCard.ScoreID;
            this.ScoreName = scoreCard.ScoreName;
        }
    }

}

ページをプルアップするリンクとコントローラーは次のとおりです。これはレイアウトの本文です。

        public ActionResult Audit(int id)
    {
        var auditToDetail  = _db.AuditSchedules.Single(r => r.AuditScheduleID == id);
        return View(auditToDetail);
    }

リンクは次のようになります。

/AuditSchedule/Audit/257

他に何か必要な場合はお知らせください。

私はコード ファーストのアプローチを使用しており、すべてのテーブルには関係が呼び出されたモデルがあります。

ありがとうございました

4

1 に答える 1

0

あなたの質問はかなり一般的ですが、考えるべきことがいくつかあります。

まず、MVC3 では通常、ビューをモデルに強く型付けする必要があります。あなたの場合、モデルごとに 1 つのビューが必要です。「ビュー内の複数の複数のモデル」は必要ありませんが、複数のビューを単一のページに一緒にレンダリングする必要はありません。すべて共通のデータによってリンクされています。

これを実現する 1 つの方法は、コントローラに「子アクション」(use:[ChildActionOnly]属性) を記述して、個々のモデルをそれぞれの個々のビューに送信するように設定することです。[Html.RenderAction][3] 関数を任意のビュー内で使用して、他の任意のビューをレンダリングできます。多くの場合、これを整理する最も簡単な方法は、レイアウト 4 を使用することHtml.RenderAction()です@RenderBody()

各モデルにデータを入力するには、いくつかのデータ (ID など) を知る必要がある可能性があります。これらは ViewBag または ViewData に格納し、Html.RenderAction関数でオブジェクトとして渡すことができます。(かみそりを使用している場合、ビューでの呼び出しは次のようになります。@{Html.RenderAction("actionName", new {object1 = "xyz", object2 ="abc"});}これを明確にするために、論理フローは次のようになります。

  1. サブビューをレンダリングするために必要なデータを ViewBag に入力します。
  2. メイン フォームのモデルを設定し、メイン フォームのビュー (プライマリ ビュー) を呼び出します。
  3. Html.RenderActionプライマリ ビューは、ViewBag データを使用して を呼び出し、適切なオブジェクトを設定するレイアウト ビューを定義します。
  4. レイアウトは、プライマリ ビューも「本文」としてレンダリングします ( @RenderBody())。

これの最終結果は、個々のビューに[強く型付け][7]できるビューと、モデルごとの個々のコントローラー アクションです。ビューをどこでも再利用できるようにし、各モデルに入力するためのロジックを分離するため、これは良いことです (各モデルにはコントローラーで独自のアクションがあるため)。モデルに後で変更を加えた場合、どのアクション/モデル/ビューを変更する必要があるかを簡単に知ることができます。

以下は、1 つのページに複数のモデルをレンダリングするためのオプションを理解するためのリソースです。この投稿に役立つアイテムへの素敵なリンクが含まれていないことをお詫びしますが、新しい回答者として、私は2つに制限されていました.Googleは他の人のためのガイドである必要があります.

これがお役に立てば幸いです - 幸運を祈ります!

資力:

Html.RenderAction と Html.Action - http://haacked.com ブログ

ASP.NET MVC Razor ビューで Html.RenderPartial と Html.RenderAction を使用する場合 - http://www.arrangeactassert.com

于 2012-08-02T17:03:45.857 に答える