2012-07-05 19 views
19

Mam aplikacji ASP.NET MVC. Mam na mojej stronie wiele rozwijanych list (HTML SELECT), muszę je wyłączyć, ponieważ użytkownik je wybiera kolejno jeden po drugim. Kiedy użytkownik wysyła go z powrotem do kontrolera, otrzymuję null jako funkcję (metodę działania). Szukałem i stwierdziłem, że HTML nie przesyła wartości wyłączonych pól w danych formularza. Zastąpienie wyłączonego atrybutu tylko readonly nie działałoby tak, jak działałoby rozwijanie listy rozwijanej.Uzyskaj wartość wyłączonego rozwijanego w asp.net mvc

Generuję listy rozwijane dynamicznie za pomocą javascript, gdy użytkownik jest aktywny. Więc nie ma jednego dropdown, ale tyle, ile użytkownik chce.

Czy ktoś może mi powiedzieć, w jaki sposób powinienem uzyskać wartości?

Odpowiedz

40

Jedną z możliwości jest, aby lista rozwijana disabled="disabled" i zawierać ukryte pole o tej samej nazwie i wartości, które pozwolą, aby wysłać tę wartość na serwerze:

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

Jeśli trzeba wyłączone listy rozwijanej dynamicznie z javascriptem po prostu przypisz aktualnie wybraną wartość z rozwijanego pola do ukrytego pola zaraz po wyłączeniu go.

3

Jest to domyślne zachowanie wyłączonych elementów sterujących. Proponuję dodać ukryte pole i ustawić wartość DropDownList w tym ukrytym polu i pracować z tym.

Coś jak:

//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

Można również tworzyć własne przeciążenie DropDownListFor która przyjmuje parametr bool disabled i czy podnoszenia ciężkich dla Ciebie więc widok nie jest zaśmiecone if disablethisfield then ....

Coś pomiędzy tymi liniami mógłby zrobić:

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

Istnieje 6 przeciążenia dla DropDownListFor sam więc jest to dużo monkeycoding ale to się opłaca w IMHO końcowego.

-2

przed wysłaniem połączenia $ ("# FooId"). RemoveAttr ("wyłączony")

Powiązane problemy