2009-08-11 5 views
5

Ich habe Modellklassen in Linq-zu-Sql mit partiellen Klassen mit Daten Annotationsattribute und einen Verweis auf xVal markiert.ASP.NET MVC Model/ViewModel Validierung

Wenn ich eine Ansicht direkt an ein Modell binde, funktioniert alles super, sowohl die von xVal generierte JS als auch die serverseitige Doppelprüfung.

Viele meiner Ansichten verwenden keine Eingabe für ein bestimmtes Modell. Daher richte ich View Model-Klassen ein. Anstatt eine ganze Modellinstanz zu exponieren, exponiere ich Eigenschaften in dem Modell, das ich durch die Ansicht einstellen kann/muss.

// 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; 
    } 
} 

Dieser Ansatz füllt die View-Modellklasse korrekt auf und das Repository kann den Datensatz korrekt ausfüllen.

Es zieht jedoch die Validierung überhaupt nicht durch. Ich habe den ausgegebenen Client-Code angeschaut und das Validierungs-Array ist leer für xval. Darüber hinaus ist die serverseitige Überprüfung für IsValid immer wahr.

Kann ich die Datenanmerkungen durch die Eigenschaften des Ansichtsmodells zur Validierung ziehen lassen, oder sollte ich dies auf eine andere Weise tun?

+0

Bitte markieren Sie die Antwort auf diese, wenn es Ihre Frage beantwortet –

Antwort

0

Können Sie Ihren xval-Helfercode und einige Ihrer Html.Helpers posten?

Es dauert die Entität und das Präfix, also sehe ich nicht, warum die Struktur in Ihrem Ansichtsmodell einen Unterschied machen sollte. Etwas wie:

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

James

+0

Ich habe nicht den genauen Code vor mir, aber ich habe so etwas, <% = Html.ClientSideValidation ()%>, das funktioniert, wenn es ist . Da der IsValid-Aufruf auf der Serverseite nicht korrekt funktioniert, denke ich, dass es sich bei einem Annotation-Problem nicht um ein xval-Problem handelt, sondern könnte falsch sein. – blu

4

Wenn Sie partials verwenden, und in den Subtyp passieren, müssen Sie noch qualifizieren. Siehe wie folgt:

<%@ 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> 

<% } %> 

Beachten Sie, dass der Typ ist Orderdetails, aber ich bin immer noch, dass prefixing mit Validierungsmeldungen zu behandeln.

+1

Ich hatte das gleiche Problem. – hminaya

0

Wenn ich das richtig lese, setzen Sie die DataAnnotations auf der linq in die sql-Klasse und füllen dann Ihre viewmodel-Eigenschaften mit denen aus Ihrer linq in die sql-Klasse.

Um dies mit xval arbeiten zu können, müssten Sie die DataAnnotations auf die Eigenschaften des Ansichtsmodells setzen. Soweit ich das aus xvals Code ersehen kann, schaut es nicht über die öffentlichen Eigenschaften nach irgendwelchen Validierungsinformationen hinaus (jemand korrigiert mich bitte, wenn ich hier falsch liege).

Wenn Sie die Validierung zwischen Ihrem Modell und Viewmodel transparent machen möchten, könnten Sie den Weg der Verwendung von Postsharp gehen, um die Attribute zu binden, aber dies könnte viel Arbeit für wenig Gewinn sein, wenn Sie klein programmieren.