二、理解Models,Views,Controllers

一、理解Models,Views,Controllers
这篇文章的主要目的就是来解绍ASP.NET MVC中的M,V,C这三个概念。
通过这篇文章我们来学习ASP.NET MVC的各部分如何一起协调工作,以及ASP.NET MVC体系结构与ASP.NET WEB FORMS传统程序结构和ASP的区别。

二、简单的ASP.NET MVC程序
VS的ASP.NET MVC模板会生成一个非常简单而完整的ASP.NET MVC程序框架,在这里我们就使用这个程序框架。
在VS2008中点击“文件”-“新建项目”打开新建项目对话框。在左边选择语言类型,在模板区域选择ASP.NET MVC Web Application,填写项目名称及项目所在位置,点击确定按钮。


《图1》
在创建ASP.NET MVC应用程序的时候,系统会提示我们是否要创建试项目。在这里我们不创建测试项目。


《图2》
当ASP.NET MVC 应用程序创建完成后,在解决方案管理器窗口中,我们会看到几个文件夹和文件。其中有三个文件夹非常引人注目:Models,Views,Controllers。通过字面意思大家可以猜到这三个文件夹的作用了,它们是分别存放模型文件、视图文件和控制文件的文件夹。
展开Controllers文件夹,我们会看到一个名子为HomeController.cs的文件。展开Views文件夹,我们会看到有两个子文件夹Home和Shared,展开Home文件夹我们会看到有页面两个文件About.aspx和Home.aspx(如下图所示)。这此文件形成了一个简单的ASP.NET MVC程序框架。


《图3》
在第一次按F5键或点击调试动行按钮时,会出一个对话框,如下图所示,提示我们是否要启用Web.Config文件中的调试开关。我们点击“确定”继续运行程序


《图4》
当我们运行ASP.NET MVC应用程序的时候,VS在浏览器中启动项目。这个简单的程序框架只包含两个页面:Index页面和About页面。在运行的时候默认显示Index页面,当我们点击About US链接时,会显示About页面


《图5》
在这里需要我们注意浏览器的地址栏。当我们点击Home超链接时,浏览器地址栏会变为/Home,当我们点击About Us超链接时,浏览器地址栏会变成/About
但当我们关闭浏览器,返回VS开发界面后,在程序中我们并没有发现Home和About这两个页面文件。这是为什么呢?

三、一个URL地址并不对应于一个页面!(原创:灰灰虫的家 http://hi.baidu.com/grayworm)
在传统的ASP.NET Web Forms应用程序或ASP程序中,它们的URL地址与页面文件之间是一一对应的关系。如果我要访问SomePage.aspx页面,那在服务器的硬盘上必须得有一个SomePage.aspx文件。否则会产生404-Page Not Found的错误。
相反地,在ASP.NET MVC程序中,浏览器地址栏中的URL路径和应用程序中的文件之间并没有对应关系。实际上,在ASP.NET MVC应用程序中,浏览器地址栏中的URL地址是与控制器(Controller)的动作(Action)相对应。
在传统的ASP.NET 或 ASP程序中,浏览器的请求被映射到文件上;而在ASP.NET MVC 应用程序中,浏览器的请求被映射到控制器的动作上。
传统的ASP.NET 或 ASP程序是以内容为中心,而ASP.NET MVC 应用程序则是以程序逻辑为中心。

四、理解URL Routing
浏览器的请求被映射到控制器的相应动作上,这个映射过程我们称之为URL Routing。URL Routing就是把入站请求路由到相应的控制器动作上。
URL Routing是通过路由表来处理请求的。路由表被写在Global.asax文件中,在程序第一次运行的时候会调用这段程序创建路由表。
默认情况下,MVC的Global.asax文件代码如下:
Listing 1 – Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{     
public class GlobalApplication : System.Web.HttpApplication     
   {          
   public static void RegisterRoutes(RouteCollection routes)          
    {               
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");               
     routes.MapRoute("Default","{controller}/{action}/{id}",new {controller ="Home",action="Index",id=""});
          
    }          
    protected void Application_Start()          
    {               
    RegisterRoutes(RouteTable.Routes);          
    }     
   }
}
当ASP.NET应用程序第一次启动的时候,会调用Application_Start()方法。这个方法中调用了RegisterRoutes()方法,在RegisterRoutes()方法中创建了一个默认的路由表。
默认情况下,路由表只包含一个路由。这个路由将所有的入站请求URL 地址分解为三个部:
第一部分:映射到控制器名上。
第二部分:映射到控制器的动作名上。
第三步分:映射到动作函数的Id参数上

例如:URL地址/Product/Details/3 被解析为三部分如下:
Controller = ProductController
Action = Details
Id = 3


路由的三个部分在不做设置的情况下都具有默认值
Controller默认值为HomeController。
Action的默认值为Index。
Id的默认值为空字符串。

好了,记住这些默认值后,我们再来分析下面的URL地址
/Employee
它的URL地板被解析后的三个部分为:
Controller = EmployeeController
Action = Index
Id = “”

最后来看一下,如果我们打开ASP.NET MVC应用程序时不加任何的URL地址的情况:
如:http://localhost/ 被解析为:
Controller = HomeController
Action = Index
Id = “”
大家可以看到,这种情况被默认被路由到HomeController类的的Index()动作上了。

五、理解控制层
在MVC程序中,控制层用来响应用户的请求,当浏览器发出请求时,由控制层接收,并把处理结果发送回浏览器。
控制器是一个类,在ASP.NET MVC程序中,在Controller文件夹中包含一个名子为HomeController.cs的控制器。HomeController.cs的代码如下:
Listing 2 – HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{     
public class HomeController : Controller     
   {          
   public ActionResult Index()          
    {               
    ViewData["Title"] = "Home Page";               
     ViewData["Message"] = "Welcome to ASP.NET MVC!";               
     return View();
          
    }          
   public ActionResult About()          
    {               
    ViewData["Title"] = "About Page";               
     return View();
          
    }     
   }
}
在HomeController中包含两个方法Index()和About()。这两个方法就是两个动作。当客户端发出/Home/Index请求时,会触发HomeController.Index()方法;当客户端发出/Home/About请求时会触发HomeController.About()方法。
控制器的任何public方法都被当作是控制器的动作。也就是控制器的所有public方法都可以在浏览器的URL地址栏中进行调用,因此,我们要对此小心设计。

六、理解视图层
控制层的HomeController类中的Index()和About()都返回一个视图。视图包含要发送到客户端的HTML标记和文档内容。视图相当于ASP.NET MVC应用程序的页面。
在创建视图的进候,我们需要正确设置视图的位置。
HomeController.Index()动作返回视图的路径为:\Views\Home\Index.aspx
HomeController.About()动作返回视图的路径为:\Views\Home\About.aspx
一般地,想让控制器的动作返回视图的话,我们需要在Views文件夹下创建一个子文件夹,该子文件夹应具有与控制器相同的名子。在子文件夹内我们需要创建一个.aspx文件,该.aspx文件应具有与控制器的动作相同的名子。About.aspx视图代码如下:
Listing 3 – About.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication1.Views.Home.About"%>
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">     
   <h2>About Us</h2>     
   <p>          
    TODO: Put <em>about</em> content here.     
   </p>
</asp:Content>
上面的代码中,除了第一行外,其余的内容是标准的HTML,我们可以在需要的地方修改视图的HTML内容。
一个MVC的视图与ASP或ASP.NET Web Forms比较相似。我们可以在视图的HTML内容中嵌入相应的服务器代码(C#或VB.NET)。使用脚本代码来控制数据显示。

七、理解模型层
上面我们讨论了控制层和模型层。下我们来再来谈一下模型层
MVC模型层包含了控制层和视图层之外的应用程序的所有逻辑。模型层应当包含应用程序所有的商业逻辑数据库访问逻辑例如:如果使用Linq to Sql访问数据库的话,应当在Models文件夹中创建建Linq to Sql类(dbml文件)。
视图层应当只包含生成用户界面的逻辑。控制层应当只包含返回视图或动作跳转等极少量的程序逻辑。其余所有剩下的东西都应当包含在模型层中。(原创:灰灰虫的家 http://hi.baidu.com/grayworm)
一般地,我们应当尽量实现“较厚”的模型层和“极薄”的控制层。控制层的方法中应当包含尽量的少的程序代码。如果控制层“太厚”的话,我们应想考虑把控制层部分逻辑转移到模型层中去。

总结:
这篇文章从总体上来看了ASP.NET MVC WEB应用程序的各个部分。
知道如何把URL地址路由到不同的控制器动作上。
知道控制如何与视图相协调返回用户数据。
知道模型层如何包含数据访问逻辑和商业逻辑。

转载于:https://www.cnblogs.com/zxktxj/archive/2012/04/21/2461436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的实现方案,使用MVC框架实现一级菜单toggle控制对应级菜单父物体显隐。 首先,我们需要定义一个菜单项的数据模型,包含菜单项的名称、是否选中等信息。可以在Models文件夹下创建一个MenuModel类,代码如下: ```csharp using System; namespace MVC.Models { [Serializable] public class MenuModel { public string Name { get; set; } public bool IsSelected { get; set; } } } ``` 接下来,我们需要创建一个菜单项的视图,用来显示菜单项的名称和选中状态,并响应用户的点击事件。可以在Views文件夹下创建一个MenuView类,代码如下: ```csharp using System; using UnityEngine; using UnityEngine.UI; using MVC.Controllers; namespace MVC.Views { public class MenuView : MonoBehaviour { public Text NameText; public Toggle ToggleButton; public int Index; private MenuController _controller; public void Init(MenuController controller, string name, bool isSelected, int index) { _controller = controller; NameText.text = name; ToggleButton.isOn = isSelected; Index = index; } public void OnClick() { _controller.ToggleMenu(Index); } } } ``` 这里我们使用了Unity自带的Toggle组件来实现菜单项的选中状态,点击菜单项时会调用MenuController的ToggleMenu方法来切换选中状态。 最后,我们需要创建一个菜单的控制器,用来管理菜单项的数据和视图。可以在Controllers文件夹下创建一个MenuController类,代码如下: ```csharp using System.Collections.Generic; using UnityEngine; using MVC.Models; using MVC.Views; namespace MVC.Controllers { public class MenuController : MonoBehaviour { public GameObject[] SubMenus; public MenuModel[] MenuItems; public MenuView MenuPrefab; public Transform MenuParent; private List<MenuView> _menuViews = new List<MenuView>(); void Start() { // 初始化菜单项数据 MenuItems = new MenuModel[] { new MenuModel { Name = "Item A", IsSelected = true }, new MenuModel { Name = "Item B", IsSelected = false }, new MenuModel { Name = "Item C", IsSelected = false } }; // 创建菜单项视图 for (int i = 0; i < MenuItems.Length; i++) { var menuItem = MenuItems[i]; var menuView = Instantiate(MenuPrefab, MenuParent); menuView.Init(this, menuItem.Name, menuItem.IsSelected, i); _menuViews.Add(menuView); } // 显示初始的子菜单 for (int i = 0; i < SubMenus.Length; i++) { SubMenus[i].SetActive(MenuItems[i].IsSelected); } } public void ToggleMenu(int index) { // 切换菜单项的选中状态 MenuItems[index].IsSelected = !MenuItems[index].IsSelected; // 显示或隐藏对应的子菜单 SubMenus[index].SetActive(MenuItems[index].IsSelected); // 更新菜单项视图的选中状态 _menuViews[index].ToggleButton.isOn = MenuItems[index].IsSelected; } } } ``` 在Start方法中,我们初始化了菜单项数据,并创建了菜单项视图。菜单项视图会调用MenuController的ToggleMenu方法来切换菜单项的选中状态,并根据选中状态显示或隐藏对应的子菜单。同时,我们还将菜单项视图的选中状态与菜单项数据同步。 至此,我们就完成了一个简单的一级级菜单控制脚本,使用MVC框架实现了菜单项的数据和视图分离,方便维护和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值