2011-01-13 16 views
15

Dentro de la acción de mi controlador Tengo el siguiente código:Cómo agregar errores de validación en la colección de validación asp.net mvc?

public ActionResult GridAction(string id) 
{ 
    if (String.IsNullOrEmpty(id)) 
    { 
     // add errors to the errors collection and then return the view saying that you cannot select the dropdownlist value with the "Please Select" option 
    } 

    return View(); 
} 

ACTUALIZACIÓN:

if (String.IsNullOrEmpty(id)) 
{ 
    // add error 
    ModelState.AddModelError("GridActionDropDownList", "Please select an option"); 
    return RedirectToAction("Orders"); 
} 

ACTUALIZACIÓN 2:

Aquí está mi código actualizado:

@Html.DropDownListFor(x => x.SelectedGridAction, Model.GridActions,"Please Select") 
@Html.ValidationMessageFor(x => x.SelectedGridAction) 

El loo modelo ks como la siguiente:

public class MyInvoicesViewModel 
{ 

    private List<SelectListItem> _gridActions; 

    public int CurrentGridAction { get; set; } 

    [Required(ErrorMessage = "Please select an option")] 
    public string SelectedGridAction { get; set; } 

    public List<SelectListItem> GridActions 
    { 
     get 
     { 
      _gridActions = new List<SelectListItem>(); 
      _gridActions.Add(new SelectListItem() { Text = "Export to Excel", Value = "1" }); 

      return _gridActions; 
     } 
    } 
} 

Y aquí está mi acción del controlador:

public ActionResult GridAction(string id) 
{ 
    if (String.IsNullOrEmpty(id)) 
    { 
     // add error 
     ModelState.AddModelError("SelectedGridAction", "Please select an option"); 
     return RedirectToAction("Orders"); 
    } 

    return View(); 
} 

No pasa nada! Estoy totalmente perdido en este!

Actualización 3:

Ahora estoy usando el siguiente código pero aún así la validación no está disparando:

public ActionResult GridAction(string id) 
{ 
    var myViewModel= new MyViewModel(); 
    myViewModel.SelectedGridAction = id; // id is passed as null   

    if (!ModelState.IsValid) 
    { 
     return View("Orders"); 
    } 

ACTUALIZACIÓN 4:

$("#linkGridAction").click(function() { 
    alert('link grid action clicked'); 

    $.get('GridAction/', { SelectedGridAction: $("#SelectedGridAction").val() }, function (result) { 
     alert('success'); 
    }); 
}); 

y el controlador tiene el siguiente :

// OrderViewModel has a property called SelectedGridAction. 
public ActionResult GridAction(OrderViewModel orderViewModel) 
{ 
    return View(); 
} 

Update 5: La validación no está disparando:

public ActionResult GridAction(OrderViewModel orderViewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View("Orders", orderViewModel); 
    } 
    return View(); 
} 

Respuesta

6

Se puede usar un modelo de vista:

public class MyViewModel 
{ 
    [Required] 
    public string Id { get; set; } 
} 

y luego:

public ActionResult GridAction(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // the model is valid, the user has selected an id => use it 
     return RedirectToAction("Success"); 
    } 
    return View(); 
} 

ACTUALIZACIÓN:

Después de los cientos de comentarios en mi respuesta me siento en la necesidad de proporcionar un ejemplo completo de trabajo:

Como inicio de costumbre con un modelo de vista :

public class MyViewModel 
{ 
    [Required] 
    public string SelectedItemId { get; set; } 

    public IEnumerable<SelectListItem> Items 
    { 
     get 
     { 
      // Dummy data 
      return new SelectList(Enumerable.Range(1, 10) 
       .Select(i => new SelectListItem 
       { 
        Value = i.ToString(), 
        Text = "item " + i 
       }), 
      "Value", "Text"); 
     } 
    } 
} 

Luego de un controlador:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // The user didn't select any value => redisplay the form 
      return View(model); 
     } 
     // TODO: do something with model.SelectedItemId 
     return RedirectToAction("Success"); 
    } 
} 

y finalmente la vista:

<% using (Html.BeginForm()) { %> 
    <%= Html.DropDownListFor(
     x => x.SelectedItemId, 
     Model.Items, 
     "-- Select Item --" 
    ) %> 
    <%= Html.ValidationMessageFor(x => x.SelectedItemId) %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

Desafortunadamente, hay un valor cuando el usuario selecciona la opción "Seleccione". – johndoe

+1

@johndoe, no debería haberlo. Si usa el siguiente método de ayuda: '<% = Html.DropDownListFor (x => x.Id, Model.Items," - seleccione - ")%>' para generar su lista desplegable, no se enviará ningún valor y se validará funcionará automáticamente También tiene más sentido enviar cadena vacía cuando el usuario no ha seleccionado nada en lugar de un valor ficticio. –

+0

También debo agregar que la página no se envía (no se envía el botón) pero se invoca una acción a través de un enlace y es por eso que la validación no se activa. – johndoe

53

Uso ModelState.AddModelError()

ModelState.AddModelError("MyDropDownListKey", "Please Select"); 

y la salida a la vista como esta:

<%= Html.ValidationMessage("MyDropDownListKey") %> 
+4

+1 para respuesta directa y corta "Use' ModelState.AddModelError() '". –

+0

¿De dónde consigo la clave? Tengo lo siguiente: ' @ Html.EditorFor (model => model.ClientID, new {htmlAttributes = new {@class =" form-control "}}) @ Html.ValidationMessageFor (model => model.ClientID, "", new {@class = "text-danger"}) '¿Cuál sería la clave? – Zapnologica

+0

Si sabe con qué propiedad está trabajando, puede confiar en DataAnnotations o intentar agregar un error para "ClientID" – hunter

0

En cuanto a su actualización # 3, sospecho que eso es porque en realidad se está asignando el valor, es sólo una cadena vacía (Obligatorio es la comprobación de nulo).

que quiere hacer que esto:

[Required(AllowEmptyStrings = false)] 

Su mejor apuesta, aunque sería llevar a cabo una validación personalizada (es probable que desee para verificar la clave está en la lista, etc)

Edición: error fijo en el código - se olvidó de cerrar ")"

Cuestiones relacionadas