2009-08-11 22 views
5

Mam klasy modelu w Linq-to-Sql z klasami częściowymi oznaczonymi atrybutami adnotacji danych i odniesieniem do xVal.ASP.NET MVC Model/ViewModel Validation

Kiedy wiążę widok bezpośrednio z modelem, wszystko działa świetnie, zarówno JS generowane przez xVal, jak i podwójne sprawdzanie po stronie serwera.

Wiele z moich widoków nie przyjmuje danych wejściowych do jednego określonego modelu, dlatego konfiguruję klasy modelu widoku. Zamiast eksponować całą instancję modelu, wystawiam właściwości do modelu, który zezwalam/powinienem ustawić w widoku.

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

To podejście powoduje prawidłowe wypełnienie klasy modelu widoku, a repozytorium może prawidłowo wypełnić rekord.

Wcale nie przeprowadza jednak sprawdzania poprawności. Sprawdziłem kod klienta emitowany i tablica sprawdzania poprawności jest pusta dla xval. Ponadto sprawdzanie po stronie serwera dla IsValid ma zawsze wartość true.

Czy mogę mieć adnotacje danych przeciągnąć chociaż właściwości modelu widoku do sprawdzania poprawności tak jak to, czy powinienem robić to w inny sposób?

+0

proszę oznaczyć odpowiedź na to pytanie, jeśli odpowiedział na twoje pytanie –

Odpowiedz

0

Czy możesz umieścić swój kod pomocniczy Xval, a niektóre twoje Html.Helpers?

Zajmuje encję i przedrostek, więc nie widzę powodu, dla którego struktura w twoim modelu widoku ma jakąkolwiek różnicę. Coś jak:

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

James

+0

Nie mam dokładnego kodu przede mną, ale mam coś takiego, <% = Html.ClientSideValidation ()%>, to działa, gdy to jest . Ponieważ wywołanie IsValid po stronie serwera nie działa poprawnie, uważam, że jest to problem z adnotacjami, a nie kwestia Xval, ale może się mylić. – blu

4

Jeśli używasz partials i przechodzą w podtypu, trzeba jeszcze, aby się zakwalifikować. Zobacz, co następuje:

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

<% } %> 

Należy zauważyć, że typ to OrderDetails, ale wciąż jestem prefiksem, aby poradzić sobie z wiadomościami walidacyjnymi.

+1

Miałem ten sam problem. – hminaya

0

Jeśli prawidłowo odczytam to, umieszczam DataAnnotations w klasie linq na sql, a następnie zapełniam właściwości viewmodel tymi, od których linq do klasy sql.

Aby to działało z xval, konieczne byłoby umieszczenie DataAnnotations we właściwościach modelu widoku. O ile mogę powiedzieć z kodu xvals, nie powinien on wyglądać poza właściwościami publicznymi dla jakichkolwiek informacji o walidacji (ktoś mnie poprawi, jeśli im się nie podoba).

Jeśli chcesz, aby sprawdzanie poprawności było przejrzyste pomiędzy modelem i modelem podglądu, możesz przejść na dół, korzystając z funkcji postsharp do wiązania atrybutów, ale może to być dużo pracy dla małego zysku, jeśli program jest mały.