Общие вопросы .NET MVC2 - PullRequest
       3

Общие вопросы .NET MVC2

0 голосов
/ 29 августа 2010

Я только вхожу в .NET MVC2 (даже в .NET в целом), и мне трудно знакомиться с «потоком» вещей.Основу MVC я получаю .. по большей части.Часть, над которой я сталкиваюсь, - применение стандартных методов программирования к .NET MVC.

Например,

public ActionResult Index()
{
   var dataContext = new SiteContentDataContext();
   var data = from c in dataContext.SiteContents where c.Slug == "home-page" select c;
   // call/return getMainNav()
   // call/return getSubNav()
   return View(data);
}

public ActionResult SiteContent(string strSlug)
{
   var dataContext = new SiteContentDataContext();
   var data = from c in dataContext.SiteContents where c.Slug == strSlug select c;
   // call/return getMainNav()
   // call/return getSubNav()
   return View(data);
}

private void getSubNav()
{
   // get subnav records from db.
   // return subnav records.
}

private void getMainNav()
{
   // get main nav records from db.
   // return main nav records.
}

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

Наконец, вопрос в том, как бы я заполнил функции getSubNav и getMainNav, а во-вторых, как мне вернуть эти данныеправильно ли смотреть?

Ответы [ 3 ]

1 голос
/ 29 августа 2010

Что ж, я думаю, что вы ищете здесь, это частичные представления.

Вы можете встроить представления MainNav и SubNav в представление SiteContent.

вот как это происходит.

создайте ваши MainNav и SubNav как частичные представления.

в вашем представлении SiteContent используйте метод Html.RendarPartial для включения двух других представлений.

<%= Html.RenderPartial("MainNav", Model); %>

<%= Html.RenderPartial("SubNav", Model); %>

Теперь для остальныхчасть о том, как получить данные в представлениях MainNav и SubNav.Сейчас самое время познакомиться с ViewModels.Модели представлений - это не что иное, как классы с некоторыми свойствами, которые вы хотите дать отображаемому представлению.

В вашем случае я бы создал 3 модели представлений.

  • SiteContentViewModel содержит содержимое, которое будет отображаться на вашей странице.
  • MainNavViewModel содержит данные, которые будут отображаться в MainNav.
  • SubNavVIewModel содержит данные, которыебудет отображаться в SubNav.

, тогда я включу MainNavViewModel & SubNavVIewModel в SiteContentViewModel.

(если вы уверены, что каждое представление SiteContent будет иметь MainNav и SubNav)

Теперь вы можете заполнить каждую модель представления теми данными, которые вам нужны.

вот как будет выглядеть код.

public class SiteContentViewModel {

       public MainNavViewModel MainNav { get; set;}
       public SubNavVIewModel  SubNav { get; set;}
       // Any Other Data Needed In The SiteContent View (ex. PageTitle)
}

public class MainNavViewModel {
       // Any Data Needed In The MainNav View
}


public class SubNavVIewModel  {
       // Any Data Needed In The SubNav View
}

Теперь вернемся к частичным видам, используя созданные нами модели представления, мы можем включить такие частичные элементы.

<%= Html.RenderPartial("MainNav", Model.MainNav); %>

<%= Html.RenderPartial("SubNav", Model.SubNav); %>

одна важная вещь - сделать наши представления строго типизированными.

  • Представление SiteContent типа SiteContentViewModel
  • Представление MainNav типа MainNavViewModel
  • SubNav vIew типа SubNavViewModel

и в вашем методе действия SiteContent вы сделаете что-то вроде этого

   // Initialize the ViewModels.
   SiteContentViewModel model = new SiteContentViewModel();
   model.MainNav = new MainNavViewModel();
   model.SubNav  = new SubNavVIewModel();

   // Get Data From DB and set the properties that you created in your view models.
   // examples. 
   model.PageTitle = // some data from db.
   model.MainNav.(Some Property) = // some data from db.
   model.SubNav.(Some Property ) = // some data from db.
   return View(model);

надеюсь, что это поможет ... для получения дополнительной информации вы можете увидеть эта ссылка

1 голос
/ 29 августа 2010

Вы должны изучить DDD и TDD для ASP.NET MVC. Похоже, вы используете Linq To Sql. Я попытаюсь в нескольких словах объяснить, что я делаю для создания хорошей архитектуры.

Архитектура

  1. Контекст БД
  2. Модель домена
  3. Шаблон репозитория

Рекомендуется не связывать ваш контекст базы данных с вашими контроллерами. Вы хотите, чтобы ваши контроллеры вызывали ваш репозиторий, который, в свою очередь, будет возвращать вашу модель. Теперь вот сложная часть, которую вы должны преобразовать объекты контекста БД в ваши объекты модели.

Представьте, что у вас есть таблица продуктов, которую Linq To SQL предоставит вам в качестве класса продуктов. Этот класс продуктов является частью контекста БД, и то, что вы хотите сделать, это оттолкнуть ваш контекст, фактически ваши контроллеры даже не будут знать, что он существует.

Зачем мне нужна модель, если у меня Linq To SQL?

Хорошо, для начала LTS будет восстанавливать все объекты каждый раз, когда вы меняете свою базу данных, то есть у вас не будет возможности вносить изменения в контекст БД. А также вы хотите иметь возможность использовать аннотации ASP.NET MVC 2 для проверки и многое другое.

Теперь создайте класс продуктов для вашей модели

namespace MvcApplication.Models
{
    public class Product
    {
        public int Id { get; set; }

        [Required]
        [StringLength(10)]
        public string Name { get; set; }

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

        [DisplayName("Price")]
        [Required]
        [RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
        public decimal UnitPrice { get; set; }
    }
}

Теперь вы видите, что этот класс является частью модели, полностью отключенной от контекста БД. Теперь, что мы делаем дальше, создаем наш класс репозитория.

namespace MvcApplication.Repository
{
    public class AppRepository {

       DbContext _context = new DbContext();

       public IQueryable<Products> GetProducts()
       { 
           return from p in _context.Products
                  select new Product {
                       Name = p.Name,
                       UnitPrice = p.UnitPrice
                  }
       }
   }
}

Теперь в вашем контроллере вы просто вызываете GetProducts ();

public ActionResult SiteContent(string strSlug)
{
   var repository = new AppRepository();
   return View(repository.GetProducts());
}

Довольно, не правда ли.

Вы можете использовать AutoMapper для сопоставления ваших объектов контекста БД с объектами модели. http://automapper.codeplex.com/

1 голос
/ 29 августа 2010

Просмотр объектов ViewModel, созданных вами объектов, цель которых в жизни - переносить данные в ваши представления и из них.Папка Models, созданная для вас по умолчанию в новом проекте MVC, будет содержать именно эти классы.

У вас есть варианты, кроме методологии объекта ViewModel, но ни один из них не настолько чист.(Словарь ViewData поможет вам, но он не предназначен для того, чтобы быть основным средством предоставления данных вашим представлениям.) Вот пример того, как установить свойство Model объекта ViewData для экземпляра заполненного экземпляра viewmodel:

    public ActionResult SiteContent(string strSlug) {
        SiteContentVM model = new SiteContentVM();
        SiteService siteService = new SiteService();
        model.Slug = siteService.GetALittleSlimyCreature(strSlug);
        model.List1 = siteService.GetList1();
        model.List2 = siteService.GetList2();
        ViewData.Model = model;
        return View();
    }

Теперь вы можете создать строго типизированное представление (в комплекте с intellisense) для ссылки на любые свойства вашего экземпляра объекта ViewModel из вашего представления просто через свойство Model:

<% foreach (var item in Model.List1) { %>
    <% Html.Encode(item.StringField) %> <!-- <= writing a property -->
    <% Html.RenderPartial("PartialNameHere", item); %> <!-- <= the equivalent of a usercontrol -->
<% } %>

Как вы видите выше, процесс получения данных из базы данных не меняется для MVC.Вы делаете это так же, как в обычном веб-проекте.(... обычно это включает в себя создание бизнес-логики или класса обслуживания, а не написание кода в проекте MVC.)

Наслаждайтесь MVC!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...