2009-08-11 18 views
5

Tengo clases de modelo en Linq-to-Sql con clases parciales marcadas con atributos de anotación de datos y una referencia a xVal.ASP.NET MVC Model/ViewModel Validation

Cuando vinculo una vista directamente a un modelo todo funciona bien, tanto el JS generado por xVal como el lado del servidor hacen una doble comprobación.

Muchas de mis vistas no aceptan entradas para un modelo específico, así que estoy configurando ver clases de modelos. En lugar de exponer una instancia de modelo completa, expongo las propiedades en el modelo que permití/necesito establecer por la vista.

// foo model 
public class Foo { 
    public string FooField { ... } 
    public Bar Bar { ... } 
} 

// bar model, where bar is a parent relationship of foo in the db 
public class Bar { 
    public string BarField { ... } 
} 

// view model stuff 
public class FooViewModel { 
    private Foo foo; 

    public FooViewModel() { 
     foo = new Foo() { Bar = new Bar() }; 
    } 

    public Foo Model { 
     get { return foo; } 
     set { foo = value; } 
    } 

    public string BarField { 
     get { return foo.Bar.BarField; } 
     set { foo.Bar.BarField = value; } 
    } 

    public string ExtraViewModelField { 
     get; set; 
    } 
} 

Este enfoque rellena la clase de modelo de vista correctamente y el repositorio puede rellenar el registro correctamente.

Sin embargo, no realiza la validación. He visto el código del cliente emitido y la matriz de validación está vacía para xval. Además, la verificación del lado del servidor para IsValid siempre es verdadera.

¿Puedo hacer que las anotaciones de datos extraigan las propiedades del modelo de vista para validación como esta, o debería hacerlo de otra manera?

+0

por favor marque la respuesta en esto si contestó su pregunta –

Respuesta

0

¿Puedes publicar tu código de ayuda xval y algunos de tus Html.Helpers?

Toma la entidad y el prefijo, por lo que no veo por qué la estructura dentro de su modelo de visualización debería hacer alguna diferencia. Algo así como:

<%= Html.ClientSideValidation<Foo>("Foo") %> 
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %> 

James

+0

No tengo el código exacto frente a mí, pero tengo algo así como, <% = Html.ClientSideValidation ()%>, esto funciona cuando es . Como la llamada IsValid en el lado del servidor tampoco funciona correctamente, creo que es un problema de anotación, no de xval, pero podría confundirse. – blu

4

Si utiliza parciales, y pasa en el subtipo, usted todavía tiene que calificar. Ver la siguiente manera:

<%@ Control Language="C#" 
        Inherits="System.Web.Mvc.ViewUserControl<MvcWeb.Models.OrderDetail>" %> 

<% using (Html.BeginForm()) { %> 

    <fieldset> 
     <legend>Fields</legend> 
      <%= Html.Hidden("OrderId", Model.OrderId) %> 
      <%= Html.Hidden("ProductId", Model.ProductId)%> 
     <p> 
      <label for="Quantity">Quantity:</label> 
      <%= Html.TextBox("OrderDetails.Quantity", Model.Quantity)%> 
      <%= Html.ValidationMessage("OrderDetails.Quantity", "*") %> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

en cuenta que el tipo es OrderDetails, pero todavía estoy anteponiendo que para hacer frente a los mensajes de validación.

+1

Estaba teniendo el mismo problema. – hminaya

0

Si leo esto correctamente, está colocando las Anotaciones de datos en la clase linq a sql y luego completando sus propiedades de modelo de vista con las de su clase linq a sql.

Para que esto funcione con xval, necesitaría poner las anotaciones de datos en las propiedades del modelo de vista. Por lo que puedo decir del código de xvals, no busca más información de validación más allá de las propiedades públicas (alguien corrígeme si estoy equivocado aquí).

Si desea que la validación sea transparente entre su modelo y el modelo de vista, podría seguir la ruta de usar postesharp para vincular los atributos, pero esto podría ser mucho trabajo con poca ganancia si el programa es pequeño.