2009-08-11 4 views
5

У меня есть классы моделей в Linq-to-Sql с частичными классами, отмеченными атрибутами аннотации данных и ссылкой на xVal.ASP.NET MVC Model/ViewModel Validation

Когда я привязываю представление непосредственно к модели, все отлично работает, как JS, созданный с помощью двойной проверки xVal, так и на стороне сервера.

Многие из моих представлений не вносят вклад в одну конкретную модель, поэтому я устанавливаю классы модели представления. Вместо того, чтобы подвергать весь экземпляр модели, я предоставляю свойства в модель, которые я разрешаю/должен быть задан в представлении.

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

Этот подход правильно заполняет класс модели представления, и репозиторий может правильно заполнить запись.

Он все равно не проходит проверку. Я посмотрел на код клиента, который испущен, и массив проверки пуст для xval. Кроме того, проверка сервера на IsValid всегда верна.

Могу ли я аннотации данных вытащить, хотя свойства модели просмотра для валидации подобны этому, или я должен делать это другим способом?

+0

, пожалуйста, отметьте ответ на этот вопрос, если он ответил на ваш вопрос –

ответ

0

Можете ли вы разместить свой хелпер-код xval и некоторые из ваших Html.Helpers?

Требуется сущность и префикс, поэтому я не понимаю, почему структура в вашей модели представления должна иметь какое-либо значение. Что-то вроде:

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

Джеймс

+0

У меня нет точного кода передо мной, но у меня есть что-то вроде <% = Html.ClientSideValidation ()%>, это работает, когда это . Поскольку вызов IsValid на стороне сервера работает некорректно, я думаю, что проблема с аннотацией не является проблемой xval, но может быть ошибочной. – blu

4

Если вы используете партиалы, и передать в подтипе, вам все равно нужно готовиться. См следующим образом:

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

<% } %> 

Обратите внимание, что тип является Детали_Заказами, но я все еще префиксы, что иметь дело с сообщениями проверки.

+1

У меня была эта же проблема. – hminaya

0

Если я прочитал это правильно, вы помещаете DataAnnotations в linq в класс sql, а затем заполняете свои свойства viewmodel теми, что вы от linq до sql-класса.

Чтобы заставить это работать с xval, вам нужно будет поместить DataAnnotations в свойства модели представления. Насколько я могу сказать, из кода xvals он не смотрит за публичные свойства для какой-либо информации валидации (кто-то, пожалуйста, поправьте меня, если я ошибаюсь здесь).

Если вы хотите сделать проверку прозрачной между вашей моделью и моделью просмотра, вы можете спуститься по пути использования postsharp для привязки атрибутов, но это может быть большой работой для небольшого выигрыша, если вы программируете небольшим.