2012-09-18 29 views
6

Esto funciona:Cómo pasar un parámetro opcional en ActionResult

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 

Si hago cmpPhn opcional:

public ActionResult Edit(int id, CompPhone? cmpPhn) 

me sale "error 1 El tipo 'MyProject.Models.CompPhone' debe ser un tipo de valor que no admite nulos para usarlo como parámetro 'T' en el tipo genérico o método 'System.Nullable'.

¿Cómo puedo hacer que este parámetro de entrada sea opcional?

Aquí está el modelo de vista

public class MyViewModel : IValidatableObject 
{ 
... 
public CompPhone CmpPhnF { get; set; }  
... 
} 

Llamando al método

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult PhoneTest(MyViewModel vM) 
{ 
    if (ModelState.IsValid) 
    { var cmpPhn = vM.CmpPhnF; 
    return RedirectToAction("Edit", new { id = vM.AcntId, cmpPhn }); 
    } 
    ... 
} 

Respuesta

12

Usted no está haciendo que sea opcional, usted lo está haciendo nullable. Para que sea opcional, debe definir un valor predeterminado para el parámetro. (Su único disponible para C# 4.0 o superior):

public ActionResult Edit(int id, CompPhone cmpPhn = null) 

su código actual está especificando ser Nullable y parece que CompPhoneno es una clase de un tipo de valor, y no puede ser Nullable.

CompPhone? cmpPhn es equivalente a Nullable<CompPhone> donde CompPhone debería haber un struct

+0

Gracias Habib para despejar que sutileza entre anulable y opcional de hasta. Prefiero tu respuesta sobre la de Rablinz ya que no requiere duplicar el método. Y sí CompPhone es una clase. – Joe

+0

@Joe, la respuesta de rablinz también es válida, pero si usa .Net framework 4.0 o superior, entonces viene con C# 4.0 que tiene la opción de parámetro predeterminada para un método. Antes de esa versión, debes adaptarte a la respuesta de rablinz – Habib

+0

Agregué el método de llamada a mi pregunta. Usted respondió cómo llevar la clase a un método. Tengo una pregunta de seguimiento sobre cómo pasar una clase de un método. Cuando depuro el método de llamada, el id pero no el cmpPhn se agrega a los valores de la ruta. Gracias – Joe

1

Estoy de acuerdo con Habib, que están haciendo el parámetro nullable.

Para que el parámetro sea opcional, defina dos métodos idénticos, uno con el parámetro y el otro sin él. El que esté fuera tendrá que usar un valor predeterminado predefinido para él.

public ActionResult Edit(int id) 
{ 
    var vM = new MyViewModel(); 
    vM.CmpPhnF = defaultValue; 
    ... 
} 

y

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 
Cuestiones relacionadas