我刚刚进入.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函数;其次,如何将该数据正确地返回到视图中?
答案 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个视图模型。
然后我将包括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); %>
一个重要的事情是强烈输入我们的观点。
并在您的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。我将尝试用几句话来解释我为完成一个好的架构所做的工作。
架构
最好不要将数据库上下文与控制器联系起来。您要做的是让您的控制器调用您的存储库,然后存储库将返回您的模型。现在,您必须将数据库上下文对象转换为模型对象,这是一个棘手的部分。
想象一下,您有一个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/