2013-09-02 3 views
0

Я очень новичок в этой среде MVC и, похоже, что ViewModel - хорошая практика, однако, после всех выводов в Интернете, я не совсем понимаю, как применять ViewModel к моему делу.
Понимание MVC ViewModel

У меня есть основной таблицы (клиентов) с 3-мя столбцами: Cust_ID, part_ID и dress_ID.
У меня будет другой стол под названием Кузов который имеет две колонки: part_ID и defaultValue.
Я также другая таблица с именем платьем, которая имеет три колонок: dress_ID, part_ID и LOV

клиенты таблицы будет хранить информацию о клиентах, с их предпочитаемым платьем для каждого из частей ,
Кузов таблица сохранит значение по умолчанию для каждой из частей.
Платье В таблице будет храниться список значений для доступного платья для разных частей.

На мой взгляд, у меня будет множество выпадающих списков в зависимости от данных в таблице и отобразите соответствующий список значений в списке выпадающих списков для моего клиента. Как я должен на самом деле разрабатывать свое решение, реализуя viewmodel? Любая помощь будет очень высоко ценится.
Ниже показывает мой пример данных базы данных:

enter image description here

И мой ожидаемый вид, как показано ниже: enter image description here

+0

ViewModel - это класс, предоставляющий данные для вашего вида, проблема с LOV (DropDownLists) или что-то еще? –

+0

Нет никаких проблем, если я должен использовать ViewData, чтобы сбрасывать все данные в них и отображать их в представлении.Мне нужен совет о том, как создать свой viewModel для достижения того же результата. –

+0

Ну, я поставлю простое решение в качестве ответа, надеюсь, оно выполнит ваши ожидания. –

ответ

0

Если у вас есть десятки различных значений, чтобы пройти к виду, той же гибкостью, что позволяет вы до быстро добавите новую запись или переименуете существующий, станет вашим злейшим врагом. Вы останетесь на своем , чтобы отслеживать имена и значения элементов; вы не получаете помощи от Microsoft IntelliSense и компиляторов. Единственный проверенный способ справиться со сложностью программного обеспечения - это соответствующий дизайн. Таким образом, определение объектной модели для каждого представления помогает вам отслеживать, что такое представление действительно необходимо. Я предлагаю вам определить класс представлений модели для каждого вида, которое вы добавляете в приложение.

- "Программирование Microsoft ASP.NET MVC" Дино Эспозито

Простой ViewModel может быть что-то вроде этого

public class FooViewModel 
{ 
    [Required] 
    public SelectList BarLov1 { get; set; } 
    public SelectList BarLov2 { get; set; } 
    public SelectList BarLov3 { get; set; } 

    // Other data 
} 

Каждое свойство в ViewModel может платье с соответствующим ValidationAttribute.

Вы можете использовать AutoMapper для автоматизации передачи данных с вашей модели на ViewModel и наоборот.

Update:

public class CustomerViewModel 
{ 
    [Required] 
    public SelectList Parts { get; set; } 

    [Required] 
    public SelectList Dresses { get; set; } 

    [Required] 
    public string CustomerName { get; set; } 

    public string CustomerID { get; set; } 

    // Other data 
} 
+0

Можете ли вы, пожалуйста, изменить свой ответ, используя данные примера, которые я предоставил? Ваш ответ слишком общий, что очень сложно для меня связать с моей ситуацией. –

1

Если я правильно

платье таблицы и таблицы клиентов поняли - один ко многим отношения корабля

тела таблицы и таблицы клиентов - один ко многим отношений

Кузовной стол и платяной столик - Вкл. e to Многие отношения

Если это ваш дизайн модели, как показано ниже.

public class Customer 
    { 
     public int CustomerID { get; set; } 
     public List<Body> parts { get; set; } 
     public List<Dress> dresses { get; set; } 

     public Customer() 
     { 
      this.parts = new List<Body>(); 
      this.dresses = new List<Dress>(); 
     } 


    } 

    public class Body 
    { 
     public int PartID { get; set; } 
     public string DefaultValue { get; set; } 
     public Customer customer { get; set; } 
     public Dress dress { get; set; } 
    } 

    public class Dress 
    { 
     public int DressID { get; set; } 
     public int PartID { get; set; } 
     public string LOV { get; set; } 

     public Customer customer { get; set; } 

     public List<Body> parts { get; set; } 

     public Dress() 
     { 
      this.parts = new List<Body>(); 
     } 
    } 

Create View Пример реализации для платья Модель:

Контроллер:

public ActionResult Create() 
     { 
      List<Body> bodies = new List<Body>() 
      { 
       new Body{PartID=1,DefaultValue="Default1"}, 
       new Body {PartID=2,DefaultValue="Default2"}, 
       new Body {PartID=3,DefaultValue="Default3"} 
      }; 

      Dress dress = new Dress(); 
      dress.parts = bodies; 

      return View(dress); 
     } 

Вид:

@model Mvc4Test.Models.Dress 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Dress</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.PartID) 
     </div> 
     <div class="editor-field"> 

      @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue")) 
      @Html.ValidationMessageFor(model => model.PartID) 
     </div> 
     <br /><br /> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.LOV) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.LOV) 
      @Html.ValidationMessageFor(model => model.LOV) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

Не забудьте также показать, как получить доступ к viewmodel у контроллера –

+0

Посмотрите, помогает ли мое обновление – chamara

+0

Кажется, что эти классы, которые вы построили, не имеют связи с моделью ? Исправьте меня, если я ошибаюсь, что viewModel служил мостом между моделью и представлением? –

2

Модель просмотра просто содержит все данные, которые вам нужны. Вот и все. Специального дизайна или магии нет.

Если у вас 10 полей формы на вашей веб-странице, у вас будет 10 свойств в вашей модели просмотра, которые сопоставлены с ней. У вас также могут быть такие вещи, как скрытые поля (например, Id) или данные поддержки, например коллекции для dropdownlists.

Это действительно простое отображение 1: 1 требований вашего представления к классу, позволяющее строгому наложению вашего представления.

В вашем контроллере вы каким-то образом сопоставляете между своей моделью данных и моделью. Для этого вы можете использовать такую ​​инфраструктуру, как AutoMapper, или просто написать собственный код для этого сопоставления. В любом случае вы просто копируете любые данные, необходимые для представления из модели данных в GET, а в POST вы вернете результаты в модель данных и сохраните изменения.

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

Как вы структурируете модель просмотра, будет зависеть от того, как вы хотите использовать данные. Вы можете просто сгладить свою модель данных и взять несколько таблиц и превратить их в один класс. Или вы можете создать набор объектов, которые повторяются в вашем представлении. Все зависит от того, что вы хотите сделать.

Концепция модели просмотра на самом деле очень проста, и я думаю, вы уже думали об этом. Это просто данные, которые нужны мнению. Это все. И это не имеет ничего общего с вашей моделью данных, если только так и не получилось.

+0

Это означает, что для достижения ожидаемого представления, как указано выше, мне нужно будет иметь только класс ViewModel, который имеет три поля, список всех? –

+0

@IsaacLem - Если у вас есть только три раскрывающихся списка, тогда у вас будет три поля, которые содержат выбранное значение, и три коллекции, содержащие данные выпадающего списка. –