有人能向我解释一下ASP.NET MVC吗?

6

我正在尝试学习MVC,目前正在阅读Wrox专业ASP.NET MVC书籍。

到目前为止,我有点明白了。每个URL不再指向页面,而是指向控制器。控制器操作获取数据并决定使用哪个视图。

我也理解,如果我的URL类似于/product.aspx?id=100,那么控制器将获取产品详细信息并将其与“显示产品”视图合并。

现在这里有一点我不明白...

如果我的产品页面上还有其他东西,例如登录框,"十大产品"部分,类别列表等,这些可能会在其他页面上使用或不使用,那么我该如何包含它们并保持它们的代码分离?

在传统的aspx模型中,这很简单。如果我的十大产品出现在每个页面上,那么我会将它放在主页面中,但更有可能的是,如果它将在某些页面上使用而在其他页面上不使用,则将其制作成用户控件。

根据我目前对MVC的理解,我的产品控制器将需要获取十大产品,任何其他控制器生成带有十大产品的页面也将如此。

有点困惑,请帮忙解答。


1
你没有这样的URL。 :) - bzlm
1
暂停阅读,开始编码,然后你就会明白... :) - Aristos
bzlm,说得好。products/100 - jonhobbs
4个回答

4
据我目前对MVC的理解,我的产品控制器需要获取前10个产品,任何其他生成包含前10个产品的页面的控制器都需要这样做。

不一定。您可以在MVC中使用主页和局部视图来区分可重用视图内容。

这是一篇关于使用局部视图的好文章。 http://jeffreypalermo.com/blog/asp-net-mvc-and-the-templated-partial-view-death-to-ascx/

此外,在您的前10个产品示例中,您可以通过子操作呈现它:

[ChildActionOnly]
public ActionResult GetTopTenProducts() 
{
    var products = db.GetTopProducts(10);
    return View(products);
}

当你调用GetTopTenProducts()操作时,将会呈现一个名为"GetTopProducts.ascx"的部分视图(.ascx),然后在你的主页面或任何你想要显示这个前十列表的地方,你可以像这样调用它:

<% Html.RenderAction("GetTopTenProducts") %>

2

你很接近成功了。

你只是忘记了你的控制器是一个可以继承基类的类。

你可以创建一个基础控制器类来处理获取前十个产品,然后让任何需要该功能的控制器从基础类继承。

然后创建一个主页面,使用部分视图呈现传递给视图的前十个产品(来自基础控制器)。

...然后就完成了!没有重复代码。


1
请不要忘记,在ASP.NET MVC中仍然可以使用MasterPage。特别是在ASP.NET MVC 2中,您可以使用RenderAction来显示这10个产品,它可以从您选择的任何控制器中呈现操作。
除此之外,您还应该了解PartialView。

谢谢,RenderAction和PartialView看起来是我正在寻找的东西。我需要做更多的阅读。 - jonhobbs

1
你可以在MVC中使用母版页和部分视图来代替用户控件。它们的区别在于母版页没有对应的控制器。你可以通过两种方式解决这个问题。
当你使用部分视图时,可以传入一个模型。 <%= Html.RenderPartial("PartialView",Model) %> 你可以在部分视图中直接完成工作,利用代码括号 <% %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接