24

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

ユーザーが進むにつれて、javascriptを使用して動的にドロップダウンを生成しています。したがって、ドロップダウンは1つではありませんが、ユーザーが必要な数だけドロップダウンします。

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

4

5 に答える 5

61

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

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

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

于 2012-07-05T19:53:29.217 に答える
3

また、独自の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つのオーバーロードがあるので、多くのモンキーコーディングですが、最終的には効果があります。

于 2012-11-20T15:51:21.720 に答える
3

これは無効なコントロールのデフォルトの動作です。非表示フィールドを追加し、この非表示フィールドに 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)
于 2012-07-05T19:55:47.470 に答える