ASP.NET MVC Модель / ViewModel Проверка - PullRequest
5 голосов
/ 11 августа 2009

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

Когда я связываю представление напрямую с моделью, все прекрасно работает, и 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 всегда выполняется.

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

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Если вы используете партиалы и передаете подтип, вам все равно необходимо пройти квалификацию. Смотрите следующим образом:

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

<% } %>

Обратите внимание, что типом является OrderDetails, но я все еще префиксирую его для обработки сообщений проверки.

0 голосов
/ 19 ноября 2009

Если я правильно прочитал, вы помещаете DataAnnotations в класс linq to sql, а затем заполняете ваши свойства viewmodel теми, которые вы указали в linq to sql class.

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

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

0 голосов
/ 11 августа 2009

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

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

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

Джеймс

...