2009-07-13 13 views
30

Mam zestaw rozwijanych kontrolek w widoku, które są połączone z dwiema listami.Jak używać opcjonalnych parametrów w kontrolerze ASP.NET MVC

//control 
ViewData["Countries"] = new SelectList(x.getCountries().ToList(), "key","value",country); 
ViewData["Regions"] = new SelectList(x.getRegions(country).ToList(), "id", "name", regions); 

/* 
on the view 
*/ 

<% using (Html.BeginForm("","", FormMethod.Get)) 
      { %> 
      <ol> 
       <li> 
       <%= MvcEasyA.Helpers.LabelHelper.Label("Country", "Country:")%> 
       <%= Html.DropDownList("Country", ViewData["Countries"] as SelectList) %> 
       <input type="submit" value="countryGO" class="ddabtns" /> 
       </li> 
       <li> 
       <%= MvcEasyA.Helpers.LabelHelper.Label("Regions", "Regions:")%> 
       <%= Html.DropDownList("Regions", ViewData["Regions"] as SelectList,"-- Select One --") %> 
       <input type="submit" value="regionsGO" class="ddabtns" /> 
       </li> 
      </ol>  
       <br /> 
       <input type="submit" value="go" /> 
<% } %> 

Więc jej wysłania zapytania do tej samej stronie (jako jedyny naprawdę tam, aby zapewnić alternatywny sposób ustawiania/aktualizacji listy rozwijanej odpowiednie, to jest do zaakceptowania, jak to wszystko zastąpić javascript).

Adres URL na kliknięcie jest coś takiego jak ...

http://localhost:1689/?country=FRA&regions=117 

Regiony zależy od kodu kraju.

Staram się osiągnąć ten fragment, nie martwiąc się o routing, ponieważ nie ma prawdziwego sensu w odniesieniu do tej funkcji.

Sterownik ma następującą metodę.

public ActionResult Index(string country, int regions) 

Odpowiedz

65

Łańcuch powinien być w porządku, ponieważ zostanie przekazany jako pusty ciąg. Dla int, sprawiają, że pustych:

public ActionResult Index(string Country, int? Regions) 

Ponadto, będziesz pamiętać, że aktywuje go w taki sam sposób jak swojej kwerendy.

Edit

Zauważ, że teraz ASP.NET pozwala zdefiniować parametry domyślne. Np .:

public ActionResult Index(string Country, int Regions = 2) 

Jednak polecam IMHO, abyś używał tylko domyślnego w sensie semantycznym. Na przykład, jeśli celem parametru Regiony było ustawienie # regionów w danym kraju, a większość krajów ma 2 regiony (północ i południe), wówczas ustawienie domyślne ma sens. Nie użyłbym "magicznej liczby", która oznacza brak danych wejściowych (np. 999 lub -1) - w tym momencie powinieneś po prostu użyć null.

+3

A co z DateTimes? –

+3

@Bruno - użyj 'DateTime?' – Bond

26

wiem, że to jest dość stary, ale dla potomności ważne jest, aby pamiętać, że od C# 2010 (aka 4,0, wydany z .NET 4) można użyć optional argument jeśli chciał uniknąć potential pitfalls that come with nullable types. Podpis metody będzie wyglądał następująco:

public ActionResult Index(string Country, int Regions = -1) 
+2

@ChrisMcKee Dobrze zdaję sobie sprawę, że C# 4 nie było dostępne w czasie Twojego pytania, ale wyszukiwania wciąż sprawiają, że ludzie zadają te pytania, mimo że byli latami - tak natknąłem się na to. Ważne jest, aby informacje te były aktualne, chyba że pytanie jest jednoznacznie specyficzne dla danej technologii. W przypadku twojego pytania, czyta się to samo teraz, co 4 lata temu, tylko teraz są lepsze rozwiązania. – joelmdev

+0

Nie używam C# dłużej i nie mogę/nie będę komentować, czy jest to najlepsza praktyka (zasadniczo zastępujesz wartość zerową wartością -1, co zawsze było dla mnie bardziej kruche) ale nie jestem tutaj, by dyskutować/debatować). Jednak w pełni zgadzam się, że skoro wiele osób wciąż natrafia na to pytanie, to jaka powinna być najlepsza praktyka. Wolę edytować moją oryginalną odpowiedź i link do nowego zadanego pytania. –

+0

@JamesS ScottGu mówi o swoich preferencjach tutaj: http://weblogs.asp.net/scottgu/optional-parameters-and-named-arguments-in-c-4-and-a-cool-scenario-w-asp- net-mvc-2, która jest metodą 'int Regions = -1'. – ShawnFeatherly

Powiązane problemy