MVC自整理

·Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类。

· Views: 应用程序动态生成 HTML所使用的模板文件。

· Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板。

控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。
最佳做法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据库进行交互。相应的,一个视图模板应该只和控制器所提供的数据进行交互。
维持这种"隔离关系"可以帮助,保持代码的干净、测试性和更易维护

Windows Azure是微软基于云计算的操作系统,和Azure Services Platform一样,是微软“软件和服务”技术的名称。
Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。
云计算的开发者能使用微软全球数据中心的储存、计算能力和网络基础服务。
Azure服务平台包括了以下主要组件:Windows Azure;Microsoft SQL数据库服务,Microsoft .Net服务;用于分享、储存和同步文件的Live服务;针对商业的Microsoft SharePoint和Microsoft Dynamics CRM服务。

MapRoute方法是使用HTTP请求路由查找到正确的控制器(controller)和行动方法,并提供了可选ID的参数。
MapRoute方法也被用于通过HtmlHelpers如ActionLink的控制器,操作方法及任何路由数据,以生成URL

@Html.ActionLink("Edit", "Edit", new { id=item.ID })
ActionLink是一个帮助方法(Helper),便于动态生成指向Controller中操作方法 的HTML 超链接链接。
ActionLink方法的第一个参数是想要呈现的链接文本 (例如,<a>Edit Me</a>)。
第二个参数是要调用的操作方法的名称(在本例中, Edit方法)。
最后一个参数是一个匿名对象(anonymous object),用来生成路由数据 


ASP.NET MVC会调用不同的控制器类(和其内部不同的操作方法)这取决于传入URL。
所使用的ASP.NET MVC的默认URL路由逻辑使用这样的格式来判定哪些代码以便调用:
/[Controller]/[ActionName]/[Parameters]
URL 的第一部分确定要执行的控制器类。所以 /HelloWorld 映射到 HelloWorldController 类。
URL 的第二部分确定的行动方法上要执行的类。所以 /HelloWorld/Index 会导致 Index 的方法 HelloWorldController 类来执行。
请注意,我们只有以浏览到 /HelloWorld 和 Index 方法在默认情况下。这是因为一种方法称为 Index 是如果不显式指定一个称为控制器的默认方法。
URL 段 ( Parameters) 第三部分是为路由数据。


使用HttpServerUtility.HtmlEncode(对字符串进行 HTML 编码并返回已编码的字符串。)来保护应用程序的恶意输入 (即 JavaScript)。
return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); 

(问号) 在的 URL 是分隔符,接着的查询字符串。& 字符分隔的查询字符串。


布局模板允许您在一个地方指定您的网站的 HTML 容器布局,然后将其应用在多个页面在您的网站。
发现@RenderBody()线。 RenderBody是在您创建的所有视图特定页面都显示出来,"包装"在布局页面中的占位符。
例如,如果您选择关于链接,在RenderBody方法内部呈现Views\Home\About.cshtml视图。


实体框架 (通常称作 EF) 支持一个称为代码优先的发展模式。
代码首先允许您通过编写简单的类来创建模型对象。(这些也被称为是 POCO 类,从"纯老 CLR 对象。")然后,您可以使上您的类,从而使非常干净和快速开发工作流创建的数据库。


LocalDB是轻量级的版本的 SQL Server 表示数据库引擎,按需启动和运行在用户模式下。
LocalDB 运行中的 SQL Server Express 使您能够使用数据库的.mdf文件作为特殊的执行模式。
通常情况下,LocalDB 数据库文件保存在 web 项目的App_Data文件夹中。


<add name="EFDbContext" providerName="System.Data.SqlClient"

         connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=SportsStore;

         Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\SportsStore.mdf" />

        其中,name属性一定要跟自己的DbContext类名相一致,如果此处不一致就找不到数据库了,它俩就是匹配作

     用 。这样写之后EFDbContext类才会去跟该字符串指向下的数据库做映射。

     其中的Data Source指定数据库类型

     其中Integrated Security指的是登陆类型,此处跟写“True”作用一样,就是可以以windows 身份登录,每

     次登录你就不用输账号密码了。如果是“false”就是指的sql server方式登录就要账号密码齐全。

     其中Initial Catalog属性就是初始数据库名称,字面也知道个大概,我也不详细说了,至于他有没有深层次

     的作用我还不知道,这不是易出错点。

     其中AttachDBFilename指的是一个路径,放mdf文件的地方,上面的写法是指的该文件放在自己工程的

     App_Data文件夹下面,AttachDBFilename=c:\SportsStore.mdf指的就是c盘根目录下了,所以你可以根据

     这个属性来改变访问的mdf文件。


 有三种方式将信息从控制器传递到视图:
  作为一个强类型的模型对象。
  如下这一行代码表示将一个movies列表从控制器传递到了视图中。
  return View(movies.ToList());

  作为一种动态类型 (使用 @model 动态)  @model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类
  @model MvcMovie.Models.Movie 此@model声明使得控制器可以将强类型的Model对象传递给View视图, 从而您可以在视图里访问传递过来的强类型电影Model。
  @model IEnumerable<MvcMovie.Models.Movie>此@model声明使得控制器可以将强类型的电影列表Model对象传递给View视图。
  例如,在Index.cshtml模板中,在强类型的Model对象上使用foreach语句循环遍历电影列表

  使用 ViewBag
 数据是使用模型联编程序 采取从 URL 和传递给控制器。
 控制器的数据打包成一个ViewBag对象,并将该对象传递给视图。视图然后是向用户显示为 html 格式的数据。
一个控制器可以使用ViewBag对象来将数据或对象传递到视图模板中。
ViewBag是一个动态对象,它提供了一种便利的,后期绑定的方法来将信息从控制器传递到视图中。
你可以为它添加任何属性并赋上属性值。在未赋值之前该属性是不生效的,直到你赋值为止。
例如:
public ActionResult Welcome(string name, int numTimes = 1)
        {
            ViewBag.Message = "Hello " + name;
            ViewBag.NumTimes = numTimes;
            return View();
        }
ViewBag对象中已经包含了数据,它将被自动传递给视图。


DAtaAnnotaions 的属性--
命名空间:System.ComponentModel.DataAnnotations
Required:标识该属性为必需参数,不能为空
StringLength:标识该字符串有长度限制,可以限制最小或最大长度
Range:标识该属性值范围,通常被用在数值型和日期型
RegularExpression:标识该属性将根据提供的正则表达式进行对比验证
CustomValidation:标识该属性将按照用户提供的自定义验证方法,进行数值验证
DataType属性用于指定一个比数据库内部类型更加具体的一种数据类型,但它们不是验证属性
该DisplayFormat的属性是用来显式地指定日期格式的
        [StringLength (60,MinimumLength=3)]
        public string Title { get; set; }

        [Display(Name = "Release Date")] [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime ReleaseDate { get; set; }

        [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")]
        [Required][StringLength(30)]
        public string Genre { get; set; }

        [Range(1, 100)] [DataType(DataType.Currency)]
        public decimal Price { get; set; }

        [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")]
        [StringLength(5)]
        public string Rating { get; set; }
DataType属性的优势:
浏览器可以启用HTML5功能(比如显示日历控件,本地化的货币符号,电子邮件链接,客户端输入验证等)
默认情况下,浏览器将使用基于本地区域设置的正确格式来呈现数据
DataType属性可以让MVC自动选择正确的字段模板来呈现数据(DisplayFormat使用字符串模板)

一 Html.ActionLink("linkText","actionName")
该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法,
默认控制器为当前页面的控制器,如果当前页面的控制器为Products,则 Html.ActionLink("detail","Detail")
则会生成 <a href="/Products/Detail">all</a>
 
二 Html.ActionLink("linkText","actionName","controlName")
该重载比第一个重载多了一个参数,他指定了控制器的名称,
如Html.ActionLink("detail","Detail","Products")则会生成
<a href="Products/Detail">all</a>
 
三 Html.ActionLik("linkText","actionName",routeValues)
routeValue可以向action传递参数,如Html.ActionLink("detail","Detail",new { id=1})
会生成 <a href="Products/Detail/1">detail</a>,
此处假设当前的控制器是Products.

四 Html.ActionLink("linkText","actionName",routeValues,htmlAttributes)
htmlAttribute可以设置<a>标签的属性,
如 Html.ActionLink("detail","Detail",new{id=1},new{ target="_blank"})
会生成 <a href="Products/Detail/1" target="_blank">detail</a>,
需要主要的是如果写成 new{ target="_blank",class="className"}则会报错,
因为class是关键字,此处应该写成 @class="className"。

@Html.TextBoxFor(a=>a.Name)和@Html.TextBox("Name")实质是一样的 显示结果也一样
区别: 一种强类型的HtmlHelper编程方式 一种是手写字符串的方式

http协议默认先以get方式获取数据,无论是否以哪种方式发起的,总是get方式优先,即通过get方式获取到了数据就不会再去通过post方式获取一遍,如果get方式获取不到,再以post方式获取
post和get的区别?
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;


MVC Html.AntiForgeryToken() 防止CSRF攻击
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,
它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,
而CSRF则是伪造成受信任用户对网站进行攻击。

ValidationSummary 控件用于在网页、消息框或在这两者中内联显示所有验证错误的摘要。
在该控件中显示的错误消息是由每个验证控件的 ErrorMessage 属性规定的。
如果未设置验证控件的 ErrorMessage 属性,就不会为那个验证控件显示错误消息。


派生类是子类  基类是父类 基类派生子类 子类继承基类 基类是老子,派生类是儿子,如果派生类被继承了,就是有孙子了
子类(派生类) 父类(基类) 
  1.子类拥有父类所有的成员.
  2.protected 修饰的成员只能在本类和子类中访问. 
  3.创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间 也会为父类对象的所有字段开辟空间. 只不过父类私有的成员访问不到而已。
  4.子类从父类继承父类所有的非私有成员. 
  5.base关键字可以调用父类的非私有成员.
  6.子类的访问级别不能比父类高.   
  7.创建子类对象的时候,1.调用子类的构造函数 2.调用父类的构造函数 3.执行父类的构造函数 4.执行子类的构造函数.

  8.子类的构造函数后面默认加了1个 :base() 通过这个调用父类的无参数的构造函数.
  9.如果父类没有无参数的构造函数 将会报错,因为子类的构造函数默认会调用父类的无参数的构造函数.
 10.使用base关键字可以显示的指定子类构造函数调用父类有参的构造函数.

 1. 为什么要调用父类的构造函数
      父类的构造函数会初始化父类属性的值.
 
续:
1. 继承的好处:方便代码管理. 子类可以拥有父类的非私有成员  为了多态.
2. 子类的构造函数.默认会去调用父类的无参数的构造函数.
3.  显示指定子类构造函数调用的父类构造函数 base
4.  创建子类对象的内存图.
5. this 可以点出子类的所有成员和父类的非私有成员 base可以点出父类的非私有成.


只包含属性 不包含方法的类叫做实体类
把所有动作(方法和事件)放在另外的类中, 叫做控制类

DbSet 表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合

overload是重载 override是覆盖 

默认情况下BeginForm 使用POST方式提交表单数据,这意味着参数通过HTTP消息正文传递而不是通过URL查询字符串。
当你指定使用HTTP GET时,表单数据通过URL查询字符串来传递,这样可以允许用户将URL保存为书签。W3C guidelines for the use of HTTP GET推荐你应该在不会更新数据的方法中使用GET方式。


DbContext 在读取一个实体并将其呈现到页面上后就会被销毁,
当HttpPost Edit方法被调用,此时会生成一个新的请求和DbContext 实例,所以你必须手动设置实体状态为Modified,
然后当你调用SaveChanges方法时,Entity Framework 会更新数据库行的所有列,因为数据库上下文没有办法知道你到底更改了哪些属性。

弹性连接(瞬时错误的自动重试)和命令拦截(捕获所有发送到数据库的SQL查询语句并记录至日志中)

  

转载于:https://www.cnblogs.com/Mr-xue/p/4755636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: dispatcherservlet是Spring MVC框架的核心组件之一,负责接收所有的客户端请求,并将其分发给相应的处理器方法进行处理。 首先,dispatcherservlet作为一个前端控制器,接收到所有的请求,并根据请求的URL将其映射到具体的处理器方法上。它通过HandlerMapping来完成URL到方法的映射,可以根据不同的URL配置不同的映射规则。 其次,dispatcherservlet将请求分发给对应的处理器方法进行处理。处理器方法是真正执行业务逻辑的地方,它们是由@Controller注解标记的方法。在处理器方法中,可以获取客户端传递过来的参数,并根据业务需求处理这些参数。处理器方法还可以返回相应的结果,例如将数据模型返回给视图进行渲染。 最后,dispatcherservlet将处理结果返回给客户端。它通过ViewResolver来找到对应的视图,将数据模型传递给视图进行渲染,并将渲染后的内容返回给客户端。视图可以是HTML页面、JSON数据等多种形式,根据业务需求进行配置。 总之,dispatcherservlet在Spring MVC框架中起到了非常重要的作用。它负责接收客户端请求,并将请求分发给对应的处理器方法进行处理。通过配置不同的映射规则和视图解析器,我们可以实现灵活的请求处理和响应结果的渲染。通过学习和理解dispatcherservlet的工作原理,可以更好地使用和理解Spring MVC框架。 ### 回答2: Spring MVC是一个基于Java的Web应用开发框架,其中的DispatchServlet是Spring MVC的核心组件之一。DispatchServlet是一个Servlet类,用于接收HTTP请求并将其分发给不同的Controller进行处理。 在Spring MVC中,DispatchServlet是由Web容器(例如Tomcat)加载并初始化的。当客户端发送HTTP请求时,Web容器将请求发送到DispatchServlet,DispatchServlet通过URL映射来确定将请求分发给哪一个Controller进行处理。URL映射是通过配置文件或注解来实现的,可以根据请求的URL路径、请求参数等来进行匹配。 DispatchServlet将请求分发给Controller后,Controller会根据请求的业务逻辑进行处理,并生成相应的响应。在处理请求的过程中,Controller可以通过注解来获取请求的参数、请求头等信息,并进行相应的处理。处理完成后,Controller会返回一个ModelAndView对象,其中包含了响应的数据和视图名。 DispatchServlet在接收到Controller返回的ModelAndView后,会将数据传递给ViewResolver来解析视图名并找到相应的视图模板。ViewResolver负责将响应的数据以及视图模板进行解析和渲染,最终生成一个HTML响应,并将其返回给客户端。 除了处理请求分发和视图解析外,DispatchServlet还负责处理异常和拦截器等功能。当请求处理过程中发生异常时,DispatchServlet会将异常信息进行捕获并交给异常处理器进行处理。拦截器可以用于在请求到达Controller之前或之后进行一些预处理或后处理操作,例如登录拦截、权限验证等。 总之,DispatchServlet是Spring MVC框架中的核心组件之一,负责接收并分发HTTP请求,处理请求的分发、视图解析、异常处理和拦截等功能,是Spring MVC框架实现Web应用开发的重要部分。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值