一般.NET MVC2问题

时间:2010-08-29 00:43:36

标签: asp.net-mvc asp.net-mvc-2

我刚刚进入.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 个答案:

答案 0 :(得分:1)

查看ViewModel对象,您创建的对象,其生命目的是将数据传入和传出视图。默认情况下,在新的MVC项目中为您创建的Models文件夹将完全包含这些类。

除了ViewModel对象方法之外,您还有其他选项,但没有一个是干净的。 (ViewData字典可以提供帮助,但它并不是为视图提供数据的主要方法。)以下是如何将ViewData对象的Model属性设置为实例化,填充的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完成),只需通过Model属性即可在视图中引用ViewModel对象实例的任何属性:

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

如上所述,从数据库获取数据的过程对于MVC没有变化。你可以像在普通的webforms项目中那样做。 (...通常这涉及实例化某种业务逻辑或服务类,而不是实际在MVC项目中编写代码。)

享受MVC!

答案 1 :(得分:1)

嗯,,,我认为你在这里寻找的是部分观点。

您可以嵌入MainNav&amp; SubNav视图进入SiteContent视图。

这是怎么回事。

创建您的MainNav&amp; SubNav作为部分视图。

在SiteContent视图中的

使用Html.RendarPartial方法包含其他两个视图。

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

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

现在剩下的部分介绍如何将数据传输到MainNav&amp; SubNav视图。现在是熟悉ViewModels的好时机。视图模型只是具有某些属性的类,您希望为要显示的视图提供这些属性。

在你的情况下,我会创建3个视图模型。

  • SiteContentViewModel包含将在您的页面中显示的内容。
  • MainNavViewModel包含将在MainNav中显示的数据。
  • SubNavVIewModel包含将在SubNav中显示的数据。

然后我将包括MainNavViewModel&amp; SiteContentViewModel中的SubNavVIewModel。

(如果您确定每个SiteContent View都有一个MainNav&amp;一个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); %>

一个重要的事情是强烈输入我们的观点。

  • SiteContentViewModel类型的SiteContent视图
  • MainNavViewModel类型的MainNav视图
  • 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);

希望有帮助......有关详细信息,请参阅this链接

答案 2 :(得分:1)

您应该查看ASP.NET MVC的DDD和TDD。对于它的外观,你似乎使用Linq To Sql。我将尝试用几句话来解释我为完成一个好的架构所做的工作。

架构

  1. 数据库上下文
  2. 域名模型
  3. 存储库模式
  4. 最好不要将数据库上下文与控制器联系起来。您要做的是让您的控制器调用您的存储库,然后存储库将返回您的模型。现在,您必须将数据库上下文对象转换为模型对象,这是一个棘手的部分。

    想象一下,您有一个Products表,Linq To SQL将为您提供Products Class。 产品类是数据库上下文的一部分,您想要做的是疏远您的上下文,实际上您的控制器甚至不知道它存在。

    当我有Linq To SQL时,为什么我需要一个模型?

    对于初学者来说,LTS会在每次更改数据库时重新生成所有对象,这意味着您无法更改数据库上下文。此外,您还希望能够使用ASP.NET MVC 2 Annotations进行验证等。

    现在为您的模型创建一个产品类

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

    现在您看到此类是模型完全与数据库上下文断开连接的一部分。现在我们接下来要做的就是创建我们的Repository Class。

    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将数据库上下文对象映射到Model对象。 http://automapper.codeplex.com/