net mvc data custom bootstrap asp annotation asp.net validation asp.net-mvc-2 modelstate

asp.net - mvc - ModelState siempre válido



modelstate validation (2)

Tengo algo aparentemente muy simple que no funciona.

Tengo un modelo

public class Name: Entity { [StringLength(10), Required] public virtual string Title { get; set; } } public class Customer: Entity { public virtual Name Name { get; set; } }

un modelo de vista

public class CustomerViweModel { public Customer Customer { get; set; } }

una vista

<% using(Html.BeginForm()) { %> <%= Html.LabelFor(m => m.Customer.Name.Title)%> <%= Html.TextBoxFor(m => m.Customer.Name.Title)%> <button type="submit">Submit</button> <% } %>

y un controlador

[HttpPost] public ActionResult Index([Bind(Prefix = "Customer")] Customer customer) { if(ModelState.IsValid) Save else return View(); }

No importa lo que escriba como título (nulo, o una cadena> 10 caracteres), ModelState.IsValid siempre es verdadero. El campo Título en el objeto Cliente tiene un valor, por lo que los datos se pasan, pero no se validan.

¿Alguna pista?


En su vista, no veo ningún cuadro de texto o un campo que permita enviar datos al controlador, solo una etiqueta. Las propiedades no serán validadas si no se publican . Agregue un cuadro de texto, déjelo en blanco y su modelo ya no será válido:

<%= Html.TextBoxFor(m => m.Customer.Name.Title)%>

ACTUALIZAR:

Aquí está el código que he usado:

Modelo:

public class Name { [StringLength(10), Required] public virtual string Title { get; set; } } public class Customer { public virtual Name Name { get; set; } } public class CustomerViewModel { public Customer Customer { get; set; } }

Controlador:

public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index([Bind(Prefix = "Customer")]Customer cs) { return View(new CustomerViewModel { Customer = cs }); } }

Ver:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyApp.Models.CustomerViewModel>" %> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <% using(Html.BeginForm()) { %> <%= Html.LabelFor(m => m.Customer.Name.Title)%> <%= Html.TextBoxFor(m => m.Customer.Name.Title)%> <button type="submit">Submit</button> <% } %> </asp:Content>

Cuando envía este formulario, se muestra un error de validación.

Observación 1: He omitido la clase base Entity en los modelos ya que no sé cómo se ve.

Remark2: he cambiado el nombre de la variable en la acción Index a cs . Recuerdo que hubo algunos problemas con ASP.NET MVC 1.0 cuando tenía el prefijo y la variable llamada igual, pero no estoy seguro de si esto se aplica aquí y creo que fue corregido.


Lo descubrí, fue porque estoy haciendo referencia a System.ComponentModel.DataAnnotations 3.6 en lugar de 3.5. Por lo que veo, 3.6 es solo para los servicios WCF RIA.