2009-07-13 16 views
30

Tengo un conjunto de controles desplegables en una vista que están vinculados a dos listas.¿Cómo se usan los parámetros opcionales en un controlador 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" /> 
<% } %> 

Por lo que su envío de una consulta a la misma página (como su único realmente allí para proporcionar una forma alternativa de crear/actualizar las listas desplegables apropiadas, esto es aceptable, ya que todo se reemplazó con javascript).

La url de clic es algo así como ...

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

Regiones depende del código de país.

Estoy tratando de lograr esto sin preocuparme por el enrutamiento, ya que no hay ningún punto real con respecto a esta función.

El controlador tiene el siguiente método.

public ActionResult Index(string country, int regions) 

Respuesta

65

La cadena debería estar bien, ya que pasará como una cadena vacía. Para int, que sea anulable:

public ActionResult Index(string Country, int? Regions) 

Además, se le nota que capitalizan en la misma era como su cadena de consulta.

Editar

Tenga en cuenta que ASP.NET ahora le permite definir los parámetros por defecto. P. ej .:

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

Sin embargo, en mi humilde opinión, le recomendaría que solo utilice el valor por defecto cuando tenga sentido semántico. Por ejemplo, si el propósito del parámetro Regiones fue establecer el número de regiones en un país, y la mayoría de los países tienen 2 regiones (Norte y Sur), entonces establecer un valor predeterminado tiene sentido. No utilizaría un "número mágico" que indique falta de información (por ejemplo, 999 o -1); en ese momento solo debe usar null.

+3

¿Y qué ocurre con DateTimes? –

+3

@Bruno - use 'DateTime?' – Bond

26

Sé que esto es bastante antiguo, pero para la posteridad es importante tener en cuenta que a partir de C# 2010 (también conocido como 4.0, lanzado con .NET 4) podrías usar optional argument si querías evitar el potential pitfalls that come with nullable types. Su firma de método sería así:

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

@ChrisMcKee Soy consciente de que C# 4 no estaba disponible en el momento de su pregunta, pero las búsquedas aún hacen que la gente haga estas preguntas a pesar de tener años. Así es como me topé con eso. Es importante mantener actualizada la información a menos que la pregunta sea explícitamente específica para cierta tecnología. En el caso de su pregunta, dice lo mismo ahora que hace 4 años, solo que ahora hay mejores soluciones. – joelmdev

+0

Ya no uso C#, y no puedo/no comentaré si esta es la mejor práctica actual (esencialmente estás reemplazando null con -1, que siempre me ha parecido más frágil ... .pero no estoy aquí para discutir/debatir). Sin embargo, estoy totalmente de acuerdo con que dado que muchas personas aún se encuentran con esta pregunta, cualquiera que sea la mejor práctica, debería estar disponible. Prefiero editar mi respuesta original y el enlace a una nueva pregunta/respuesta. –

+0

@JamesS ScottGu habla sobre su preferencia aquí: http://weblogs.asp.net/scottgu/optional-parameters-and-named-arguments-in-c-4-and-a-cool-scenario-w-asp- net-mvc-2 que es el enfoque 'int Regions = -1'. – ShawnFeatherly

Cuestiones relacionadas