ASP.NET MVCアプリケーションがあります。ページに複数のドロップダウンリスト(HTML SELECT)があり、ユーザーが1つずつ選択していくため、それらを無効にする必要があります。ユーザーがそれをコントローラーにポストバックすると、関数(アクションメソッド)パラメーターとしてnullが取得されます。検索したところ、HTMLがフォームデータの無効なフィールドの値を送信しないことがわかりました。無効化された属性をreadonlyに置き換えると、ドロップダウンが機能するようになるため機能しません。
ユーザーが進むにつれて、JavaScriptを使用して動的にドロップダウンを生成しています。したがって、ドロップダウンは1つではなく、ユーザーが望むだけの数です。
誰かが値を取得する方法を教えてもらえますか?
1つの可能性は、ドロップダウンリストを作成することですdisabled="disabled"
と同じ名前と値を持つ非表示フィールドを含めます。これにより、この値をサーバーに送信できます。
@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" })
@Html.HiddenFor(x => x.FooId)
JavaScriptでドロップダウンを動的に無効にする必要がある場合は、ドロップダウンの現在選択されている値を、無効にした直後に非表示フィールドに割り当てるだけです。
これは、無効にされたコントロールのデフォルトの動作です。非表示フィールドを追加し、この非表示フィールドに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)
独自の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つあるため、多くのサルコーディングですが、結局は利益をもたらします。