2013-09-17 3 views
2

Я хочу создать сайт на 1-страницу с knockout.js и MVC 4.Как объявить MVC-модель и WCF DataContract в одном месте?

После внесения некоторых изменений пользователь будет нажать на кнопку сохранения ориентации контроллеру Save действия.
Сторона контроллера Я хочу проверить входные данные.
Если данные действительны - мне нужно вызвать метод WCF.
Если данные недействительны - я верну кое-что на клиентскую сторону и скажу им что-то вроде «имя слишком длинное».

Это просто сделать что-то вроде этого:

  • Объявить SiteModel с DataAnnotations
  • Declare действия контроллера public JsonResult Save(SiteModel data)
  • Если модель справедлива, чем создать новый экземпляр WCF DataContract и вызова WCF метод

Код:

public JsonResult Save(SiteModel data) 
{ 
    if (ModelState.IsValid) 
    { 
     var ui = WcfUserInfo{FirstName = data.FirstName}; 
     if(wcfclient.wcfmethod(ui)) 
      return Json("IsValid"); 
    } 
    return Json("IsNotValid"); 
} 

Возможно ли создать DataContract с DataAnnotations и использовать этот DataContract в методе Save, что-то вроде public JsonResult Save(WcfDataContract data)?

Я просто не хочу создавать и поддерживать два разных класса с одинаковыми данными: одну модель MVC и один WCF DataContract.

спасибо.

ОБНОВЛЕНИЕ:
2 сообщения разрешают мою проблему.
Send objects with custom attributes via a wcf service
How to make WCF client use the same data types as the WCF service

ответ

2

В качестве счетчика к Ответ Антона, который, как я считаю, является веским аргументом, я могу утверждать, что эти два представления охватывают точно такую ​​же проблему. Что такое Просмотреть модель, но «Контент данных» между клиентом (браузером) и сервером (веб-сервером). MVC View Model и Договор WCF Data служат для установления определенного набора данных, который передается между двумя конечными точками.С этой целью, если ваш WCF Service и Договор данных существуют исключительно для обеспечения веб-сервера и клиента (браузера) данными вашего приложения, чем почему бы не использовать такое же представление.

Я не верю, что что-то не так, и не возникнет никакого конфликта: от тегов одного класса с атрибутами DataContract и DataMember вместе с атрибутами DataAnnotation, такими как; Required, Range, Display и т.д.

[DataContract] 
public class SiteModel 
{ 
    [DataMember] 
    [Display(Name = "First Name")] 
    [Required] 
    public string FirstName { get; set; } 


    [DataMember] 
    [Display(Name = "Last Name")] 
    [Required] 
    public string LastName { get; set; } 
} 

Повторюсь, я не говорю, что Антон неправильно. Я просто формулирую альтернативную перспективу, поскольку, по моему мнению, вопрос является скорее одним из мнений, чем тот, который имеет правильный и неправильный ответ.

+0

Привет. Спасибо, что редактировали мой пост. –

+0

Я пытаюсь создать DataContract с помощью [StringLength (50)]. Затем я добавлю ссылку на мою службу обслуживания в проект тестирования WCF. Создано свойство без [StringLength (50)]. Что вы можете мне посоветовать? –

3

Я знаю, что это НЕ, что вы хотите услышать, но я не могу не подчеркнуть это достаточно: Вашего контракта данных с обслуживанием и моделью представления (ваше JSON представление) не должен быть тот же. Это отдельные проблемы, хотя сейчас это не так.

Учитывая то, что мешает вам просто заменить SiteModel на WcfUserInfo, если они одинаковы (т.е. имеют одинаковые свойства)?

PS. Если вы используете AutoMapper, вам не нужно делать само отображение, AutoMapper позаботится об этом для вас с двумя строками кода: один для настройки карты и один для выполнения сопоставления.

+0

асимптотическая ошибка. существует 2 конечных точки. часть веб-сервера является просто промежуточным слоем. Я хочу использовать его как простой серверный валидатор. Проверьте что-то простое, как длина имени. И я не хочу создавать копию datacontract с AttAnotation DataAnnotation. –

Смежные вопросы