0

私はMVC4 + EF 5.0プロジェクトで学習しています.VS2012のデフォルトテンプレートを使用して空のプロジェクトを作成し、データベースを* .edmxモデルに足場し、どの会社で働いているスタッフを編集するために使用する編集ビューを使用しています.

ユーザーが入力に失敗して戻ったときに、編集ビュー (ドロップダウン) で SelectList を維持するときに問題が発生します。

DropDownList は、コントローラーから ListItem をバインドします。

Edit.cshtml

@Html.DropDownListFor(model => model.CompanyID, (SelectList)ViewData["CompanySelectList"])

MemberController.cs

[HttpGet]
public ActionResult Edit(int SelectedCompanyID = 0, int StaffID = 0)
{
    IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
    ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);

    staff s = db.staff.Find(StaffID);
    if (s == null)
    {
        return HttpNotFound();
    }
    return View(s);
}


    [HttpPost]
    public ActionResult Edit(staff s)
    {
        if (ModelState.IsValid)
        {
            db.Entry(s).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index"); //Edit Success
        }

        return View(s); //Edit Fail
    }

誰かが無効なデータを含むフォームを送信して入力に失敗すると、ビューが返されます。ただし、SelectList は ViewData からバインドされるため、ページが読み込まれると ViewData がなくなり、viewdata の動作であり、TempData に変更しても役に立ちません。

編集アクションに投稿するときに、SelectList を再度作成する必要がありますか?

セッションを使用してそれを保存することに関心がありますが、MVC 設計パターンに違反することを恐れています。

私の英語は上手ではありません。混乱してすみません。ありがとうございます。

4

1 に答える 1

1

簡単な解決策は、編集用のhttpポストメソッドで、ビューデータを再度作成することです

[HttpPost]
public ActionResult Edit(staff s)
{
    if (ModelState.IsValid)
    {
        db.Entry(s).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index"); //Edit Success
    }
    IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
    ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);


    return View(s); //Edit Fail
}

基本的に、編集ビューからサーバーに戻ると、サーバーはビュー データを再構築し、同じビューを呼び出して、リストに入力できるようにする必要があります。

現在のモデルと の両方を含むモデルを作成し、list<companys> companies = new list<companys>();データベースから再度入力するより良い方法があります。ここでも、強く型付けされたモデルを使用するだけでコンセプトは同じです。

于 2013-03-28T02:01:05.923 に答える