web-dev-qa-db-ja.com

asp.net mvcの無効なドロップダウンの値を取得します

ASP.NET MVCアプリケーションがあります。ページに複数のドロップダウンリスト(HTML SELECT)があり、ユーザーが1つずつ選択していくため、それらを無効にする必要があります。ユーザーがそれをコントローラーにポストバックすると、関数(アクションメソッド)パラメーターとしてnullが取得されます。検索したところ、HTMLがフォームデータの無効なフィールドの値を送信しないことがわかりました。無効化された属性をreadonlyに置き換えると、ドロップダウンが機能するようになるため機能しません。

ユーザーが進むにつれて、JavaScriptを使用して動的にドロップダウンを生成しています。したがって、ドロップダウンは1つではなく、ユーザーが望むだけの数です。

誰かが値を取得する方法を教えてもらえますか?

21
Brij

1つの可能性は、ドロップダウンリストを作成することですdisabled="disabled"と同じ名前と値を持つ非表示フィールドを含めます。これにより、この値をサーバーに送信できます。

@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" })
@Html.HiddenFor(x => x.FooId)

JavaScriptでドロップダウンを動的に無効にする必要がある場合は、ドロップダウンの現在選択されている値を、無効にした直後に非表示フィールドに割り当てるだけです。

51
Darin Dimitrov

これは、無効にされたコントロールのデフォルトの動作です。非表示フィールドを追加し、この非表示フィールドにDropDownListの値を設定して、これを操作することをお勧めします。

何かのようなもの:

//just to create a interface for the user
@Html.DropDownList("categoryDump", (SeectList)ViewBag.Categories, new { disabled = "disabled" });
// it will be send to the post action
@Html.HiddenFor(x => x.CategoryID)
3
Felipe Oriani

独自のDropDownListForオーバーロードを作成して、bool disabledパラメータを受け入れ、煩雑な処理を行うことで、ビューがif disablethisfield then ...で乱雑にならないようにすることもできます。

これらの行の間で何かができます:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool disabled)
{
    if (disabled)
        return MvcHtmlString.Create(htmlHelper.HiddenFor(expression).ToString() + htmlHelper.DropDownListFor(expression, selectList, new { disabled="disabled" }).ToString());
    else
        return htmlHelper.DropDownListFor(expression, selectList);
}

DropDownListForだけのオーバーロードは6つあるため、多くのサルコーディングですが、結局は利益をもたらします。

2
Peter