3

ASP MVC3 ドロップダウン リストに選択可能な項目を 2 つだけ入力し、データベースの値に基づいて選択する項目を決定しようとしています。これまでのところ、これが私の見解です(これは正しいと思います)

    <div class="editor-label">
        @Html.LabelFor(model => model.Status)
    </div>
    <div class="editor-field">
        @Html.DropDownList("CategoryID")
    </div>

しかし、コントローラーで値を取得および設定する際に問題が発生しています。

まず、私が使用している方法は、最初にリストされているドロップダウンリストの値のみを選択しているようですSelectListItem

    public ActionResult Edit(int id)
    {
        //redirect if security is not met.  Must be admin here
        if (!Security.IsAdmin(User)) return RedirectToAction("Message", "Home", new { id = 1 });

        var item = db.FollowUpItems.Find(id);

        string start = string.Empty;

        if (item.Status.Equals("O")) start = "Open";
        else start = "Closed";

        ViewBag.CategoryID = new SelectList(new[]
                                                {
                                                    new SelectListItem {Text = "O", Value = "Open"},
                                                    new SelectListItem {Text = "C", Value = "Closed"},
                                                },"Text", "Value", start);

        FollowUpItems followupitems = db.FollowUpItems.Find(id);
        return View(followupitems);
    }

次に、Save編集ページのボタンをクリックすると、コントローラーのこの部分に渡されるのStatusプロパティが常に null になります。FollowUpItem

    [HttpPost]
    public ActionResult Edit(FollowUpItems followupitems)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.Entry(followupitems).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DbEntityValidationException dbEx)
        {
            ViewBag.ErrorMessage = Common.ErrorCheck.CombineDbErrors(dbEx);
        }
        catch (Exception ex)
        {
            ViewBag.ErrorMessage = ErrorCheck.FriendlyError(ex);
        }

        return View(followupitems);
    }

編集

以下のGETクイントンの回答のおかげで問題は解決しましたが、値の設定にはまだ問題があります。この@Html.DropDownList("CategoryID")メソッドを使用するnullと、毎回コントローラーに値が返されます (Status 値の場合、他の値はすべて正常です)。@Html.DropDownListFor(m => m.Status, ViewBag.CategoryID)構文を使用すると、次のエラー メッセージが表示されます。

'コンパイラ エラー メッセージ: CS1973: 'System.Web.Mvc.HtmlHelper' には 'DropDownListFor' という名前の適用可能なメソッドがありませんが、その名前の拡張メソッドがあるようです。拡張メソッドは動的にディスパッチできません。動的引数をキャストするか、拡張メソッド構文なしで拡張メソッドを呼び出すことを検討してください。

最終編集

ビューの次のキャストにより、値を適切に設定できました

@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)
4

1 に答える 1

4

item.Status フィールドにOまたはC?が含まれています。その場合、これでうまくいく可能性があります。GETメソッドを次のように変更します。

    public ActionResult Edit(int id) {
        //redirect if security is not met.  Must be admin here
        if (!Security.IsAdmin(User)) return RedirectToAction("Message", "Home", new { id = 1 });

        var item = db.FollowUpItems.Find(id);

        //string start = string.Empty;

        //if (item.Status.Equals("O")) start = "Open";
        //else start = "Closed";

        var StatusOptions = new [] { new { Text = "Open", Value = "O" }, new { Text = "Closed", Value = "C" }};
        ViewBag.CategoryID = new SelectList(StatusOptions, "Value", "Text", item.Status);

        /* this line is duplicated 
         */
        // FollowUpItems followupitems = db.FollowUpItems.Find(id);
        return View(item);
    }

あなたの の何が問題なのかわかりません。次の@Html.DropDownList("CategoryID")ように変更することをお勧めします:

@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)

より表現力豊かであることがわかったので、それを使用します-バインドしたいモデルプロパティを明確に見ることができます。

これにより、モデル バインディングの問題が解決される場合があります。注意点 - エンティティの状態を設定する前に、まずそれをデータベース コンテキストにアタッチする必要があります。

db.Set<FollowUpItems>().Attach(followupitems);
于 2013-01-24T17:51:46.547 に答える