Asp.Net MVC(理解模型、视图和控制器)

本文深入探讨了MVC架构的工作原理,解释了一个URL如何映射到控制器的动作而非直接对应的页面,阐述了URL路由机制及默认路由表的作用,并概述了控制器、视图和模型的基本职责。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)对于一个MVC项目,一个URL并不意味着一个页面

当你创建一个传统的ASP.NET Web窗体应用程序,或者是一个动态服务器页面(ASP)应用程序,在URL与页面之间存在一对一的对应。如果你请求服务器上的一个名为SomePage.aspx的页面,那么最好在磁盘上有一个SomePage.aspx页面。如果SomePage.aspx文件并不存在,你将会获得一个丑陋的404-页面不存在错误。

当创建一个ASP.NET MVC应用程序时则大不相同,你键入到浏览器地址栏的URL与你应用程序中的文件之间并没有一个对应关系。在一个ASP.NET MVC应用程序中,一个URL与一个控制器的动作相对应,而不是磁盘上的页面。对于一个传统的ASP.NET或者ASP应用程序,浏览器请求被映射到了页面。在ASP.NET MVC应用程序中,浏览器请求被映射到了控制器动作。一个ASP.NET Web窗体应用程序是以内容为中心的。而一个ASP.NET MVC应用程序则以是应用程序逻辑为中心的。

2)理解url路由原理

浏览器请求通过形式URL(统一资源定位)的asp.net MVC功能被映射到控制器中,URL路由将即将到来的请求发送到了控制器动作。

URL路由使用一张路由表来处理来到的请求。这个路由表在你的Web应用程序首次启动时创建。这个路由表建立在Global.asax文件中。

 

当ASP.NET应用程序第一次启动时,将调用Application_Start()方法。可以看到,这个方法调用了RegisterRoutes()方法,并且RegisterRoutes()方法创建了默认的路由表。

默认的路由表只含有一个路由。这个默认的路由将所有到来的请求分为了三个分段(一个URL分段是正斜杠之间的任何东西)。第一个分段映射到了控制器名称,第二个分段映射到了动作名称,最后一个分段映射到了传递给动作的名为Id的参数。

针对url:   /Product/Details/3

这个URL将会被解析为像这样的三个部分:Controller = ProductController

Action =Details     Id = 3

最后,如果你打开一个ASP.NETMVC应用程序而不提供任何的URL(例如,http://localhost),然后这个URL将会被解析成这样:

Controller = HomeController    Action = Index   Id = ""

这个请求被发送到了HomeController类的Index()动作。

控制器

控制器负责用户与MVC应用程序交互的方式。当用户发出浏览器请求时,控制器决定向用户发回什么样的响应。控制器不过是一个类(例如,一个Visual Basic或者C#类)。包含一个名为HomeController.cs的控制器,它位于Controllers文件夹下。

视图

使用ASP.NETMVC应用程序时,一个视图等同于一个页面。

模型

MVC的模型包含了你应用程序中的所有逻辑,这些逻辑没有包含在视图或者控制器中。模型应该包含你的应用程序中的所有业务逻辑和数据库访问逻辑。例如,如果你使用LINQ to SQL访问数据库,那么你可以在Models文件夹中创建你的LINQ to SQL类(你的dbml文件)。

视图应该仅包含与生成用户界面有关的逻辑。控制器应该仅仅只包含最少量的逻辑,用于返回正确的视图或者将用户重定向到另一个动作。任何其他的事情都应该包含在模型中。

通常,你应该竭尽全力创建一个丰富的模型以及一个瘦小的控制器。你的控制器方法应该只包含几行代码。如果一个控制器动作变得太丰富,那么你应该考虑将这些逻辑抽取出来放置到Models文件夹的新类中。

Java实现一个模型、两个视图两个控制器的功能软件,即采用MVC模式或者说是观察者模式,本程序通过输入球体半径,显示球体形状,面积体积等 Sphere.java package Model; import java.util.Observable; public class Sphere extends Observable { private double radius;//球体半径 private double area;//球体面积 private double volume;//球体体积 public Sphere() { radius=100d; area=4*Math.PI*Math.pow(radius, 2); volume=4*Math.PI*Math.pow(radius, 3)/3; } public double getRadius() { return radius; } public double getArea() { return area; } public double getVolume() { return volume; } public void setRadius(double radius) { this.radius = radius; this.area = 4*Math.PI*Math.pow(radius, 2); this.volume=4*Math.PI*Math.pow(radius, 3)/3; this.setChanged(); this.notifyObservers(); } } textView.java package View; import java.util.Observer; import java.util.Observable; import java.text.NumberFormat; import javax.swing.*; import Controller.TextController; import Model.Sphere; import java.awt.*; import java.awt.event.*; public class TextView extends JPanel implements Observer { private JLabel radiusLab;//提示用户输入球体半径 private JTextField radiusTextField;//接受用户输入球体半径 //private JLabel radiusRang; private JLabel areaLab;//显示球体面积 private JTextField areaTextField;//显示输入球体半径对应的面积 private JLabel volumeLab;//显示球体体积 private JTextField volumeTextField;//显示输入球体半径对应的体积 public TextView() { try { Init(); } catch(Exception e) { e.printStackTrace(); } } private void Init() throws Exception { radiusLab=new JLabel("球体半径"); radiusLab.setForeground(new Color(0,165,168)); //radiusRang=new JLabel("[0-200]"); radiusTextField = new JTextField(12); radiusTextField.setForeground(new Color(223,100,158)); radiusTextField.setBackground(new Color(210,204,230)); areaLab=new JLabel("球体面积"); areaLab.setForeground(new Color(0,165,168)); areaTextField = new JTextField(12); areaTextField.setBackground(new Color(193,219,219)); areaTextField.setEditable(fal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值