2010-03-07 44 views
6

tengo una pequeña aplicación en la que estoy creando un clienteASP.NET MVC - ModelState.IsValid es falso, ¿cómo omitir?

[Authorize] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateCustomer(GWCustomer customer) 
{ 
    if (string.IsNullOrEmpty(customer.CustomerName)) 
    { 
     ModelState.AddModelError("CustomerName", "The name cannot be empty"); 
    } 
    //... 
    if (ModelState.IsValid) 
    { 
     //insert in db 
    } 
} 

Mi problema es que el objeto tiene una GWCustomerId, que es la clave primaria y no puede ser nulo. Esto hace que el marco de validación lo señale como un error. Pero no es un error, todavía no he creado el cliente, y por ahora debe ser nulo hasta que se guarde. ¿Cómo evito esto? ¿O arreglarlo?

Nunca consigo insertarlo en el DB porque el ModelState nunca es válido.

Editar Estoy utilizando Linq a SQL, y un patrón de repositorio.

+0

No nos ha dado ninguna información acerca de cómo está realmente validando. Probablemente quieras incluir esto. ¿Qué marco de validación? ¿Cómo son los atributos/métodos de validación? – Aaronaught

+0

Con EntityFramework, le pedirá al modelo o DAO un nuevo objeto predeterminado, luego complete los datos. En Metske Design Patterns, se llama "Builder", mientras que lo que estás probando es "Prototype". A MVC podría gustarle ese enfoque un poco más. –

+0

Su edición aún no explica nada sobre el "marco de validación". Linq to SQL y Repository Pattern no son marcos de validación. Linq to SQL es un asignador relacional de objetos y el patrón de repositorio es una abstracción CRUD. Ninguno de estos interactúa con el ModelState. ¿De dónde viene realmente el error de validación de ID? ¿Qué clase/componente? ¿Dónde está la línea de código que realmente valida la identificación? – Aaronaught

Respuesta

24

Esto excluirá el valor de la unión, pero no la validación:

public ActionResult CreateCustomer([Bind(Exclude = "Id")]GWCustomer customer) 

Incluso cuando se produce la validación, puede ModelState siendo correcta llamando:

ModelState.Remove("Id"); 

Se eliminarán las entradas relacionadas con Id y cambie la propiedad ModelState.Valid a verdadero si solo Id estaba causando errores.

No se recomienda el uso de objetos de la capa de datos en la capa de visualización. Definitivamente debería pensar en crear un modelo de vista dedicado, sin el campo Id.

+1

Esto es lo que estás buscando. – Rippo

+1

Cheers: funciona como un encanto. –

+1

ModelState.Remove era exactamente lo que necesitaba para salvarme de la anulación de atributos. ¡Gracias! –

2

Es por eso que siempre digo que los objetos ViewModel (entrada y salida) deben estar separados de los objetos de dominio.

El modelo de entrada debe validarse en la forma en que está arriba; el estado del objeto de dominio debe validarse antes de que se escriba en la base de datos (y se lanzan excepciones si de alguna manera no es válido).

+1

Tengo un patrón de repositorio, mi CRUD está en una clase separada, por hacer lo que usted describe. Estoy tratando de validar mi objeto de dominio, pero parece que el marco de validación está jugando conmigo. Creo que hice la separación de objeto de dominio y entrada/salida - "por el libro" –

+0

@pdr Estoy totalmente de acuerdo con esta respuesta. Siempre conéctese a un modelo de vista y no a los objetos de su dominio. Es una lógica separada. La respuesta aceptada podría resolver el problema, pero definitivamente no es la mejor práctica. –

3

tal vez usted tiene esta línea en su vista:

@Html.HiddenFor(model => model.Id) 

eliminarlo y la vista no enviará ese parámetro con el modelo.

+0

¿Pero EF no toma un 'Id' de' 0' como creación de una nueva Entidad? – Ciwan

Cuestiones relacionadas