2012-07-05 28 views
19

私はASP.NET MVCアプリケーションを持っています。私は自分のページ(HTML SELECT)に複数のドロップダウンリストを表示していますが、ユーザーが選択するたびにそれらを無効にする必要があります。ユーザーがそれをコントローラにポストすると、関数(アクションメソッド)がパラメータとしてnullになっています。私は検索し、HTMLがフォームデータ内の無効なフィールドの値を送信しないことを発見しました。無効な属性をreadonlyに置き換えると、ドロップダウン作業がレンダリングされるため、機能しません。asp.net mvcで無効なドロップダウンの値を取得

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

値を取得する方法を教えてもらえますか?あなたが動的にドロップダウンを無効にしている場合は

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

答えて

40

一つの可能​​性は、ドロップダウンリストdisabled="disabled"を作成し、サーバにこの値を送信することができます同じ名前と値を持つ隠しフィールドを含めることですjavascriptを使用して、現在選択されているドロップダウンリストの値を無効にした直後の隠しフィールドに割り当てます。

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) 
0

はまたbool disabledパラメータを受け取り、あなたのビューがif disablethisfield then ...でいっぱいではありませんので、あなたのために重い物を持ち上げるを行い、独自のDropDownListForのオーバーロードを作成することができます。行うことができ、これらの線の間で

何か:

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); 
} 

それはmonkeycodingたくさんのだが、それは最後の私見で報わので、一人でDropDownListForための6つのオーバーロードがあります。

-2

を送信する前に$( '#FooId')。removeAttr( 'disabled')

関連する問題