当前位置: 首页 > news >正文

ASP.NET MVC--视图

文章目录

  • 视图
    • Razor语法
    • dynamic
    • var
    • 匿名类型
    • 部分视图
      • Partial 与 RenderPartial
      • RenderPartial 与 RenderAction
      • RenderAction 与 Action

视图

Razor语法

1,语法简单:@启动的区域为标准的C#代码,其他部分是普通的html代码

2,用法:

@{string a = "abc";}    @a    @{C#代码块}    //有标签的就是html代码
@Model    //控制器传递来的对象
@Model.dog.Name    //控制器传递来的dog对象的Name属性的值
@if(),@foreach()等C#语句

3,在代码中输入大段文字
两种方法:

  • @:大段文字 //不推荐使用了,

代码:

if(Model.IsOK)
{
	@:文字
}
  • <html标签>文字</html标签>

代码:

if(Model.IsOK)
{
	<span>文字</span>
}

razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。
但是如果由于样式等原因不想加上额外的标签,那么可以用 标记,特殊的 不会输出到Html中。

4,注意:不要在@item后写分号 //分号会被当成html代码,原样输出

5,razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。
例子:不能这样写 <a href="Course@CourseId.ashx">,否则ashx会被识别为CourseId的一个属性,
应该加上()强制让引擎把CourseId识别成一个单独的语法,<a href="Course(@CourseId).ashx">
技巧:
不确定的地方就加上(),也可以按照编辑器的代码着色来进行分辨

6,如果不能自动提示,把页面关掉再打开就可以了。如果还是不能自动提示,只要运行没问题就行。
cshtml文件中如果有警告甚至错误,只要运行没问题就没关系

7,<span>333@qq.com</span>,razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。
但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”
<li>item_@item.Length</span>//会把@item.Length识别成邮箱,
因此用上()成为:

<li>item_@(item.Length)</span>

8,易错:要区分C#代码和html代码,
    正确的:style='display:(@message.IsHide?"none":"block")'
    错误的:style="display: (@message.IsHide) ? none : block"
注意:
  为了避免C#中的字符串的“”和html的属性值的“”冲突,建议如果html属性中嵌入了C#代码,那么html的属性的值用单引号

9,为了避免XSS攻击(跨站脚本攻击,在输出对象中嵌入script代码等恶意代码),Razor的@会自动把内容进行htmlencode输出,如果不想编码后输出,使用@Html.Raw()方法

10,Razor的注释方法 @要注释的内容@

11,Razor中调用泛型方法的时候,由于<>会被认为是html转回标记模式,因此要用()括起来,比如@(Html.Test)()可以解决大部分问题,在View中一般不会调用复杂的方法
12,如果cshtml中任何html标签的属性中以"~/"开头,则会自动进行虚拟路径的处理,
    当然一般是给

13,html标签的任何属性的值如果是C#的值(使用@传递过来的值),
    如果是bool类型的值,那么如果值是false,则不会渲染这个属性,如果是true,则会渲染成“属性名=属性名”
    代码示例

@{
      bool b1 = true;
      bool b2 = false;
    }

//此时生成的html代码为:
    这个特性避免了进行三元运算符的判断

14,总结:
    1、@就是C#,就是html
    2、如果想让被识别成html的当成C#那就用@()
    3、如果想让被识别成C#的当成html,用等标签,如果不想生成额外的标签,就用
    4、如果不想对内容htmlencode显示就用@Html.Raw()方法
    5、属性的值如果以"~/"开头会进行虚拟路径处理
    6、属性值如果是bool类型,如果是false就不输出这个属性,如果true就输出“属性名=属性名”

dynamic

dynamic是C#语法中提供的一个语法,实现像JavaScript一样的动态语言,可以到运行的时候再去发现属性的值或者调用方法 代码示例

dynamic p = new dynamic();
p.Name = "rupeng.com";
p.Hello();

注意:即使没有成员p.Age=3;编译也不会报错,只有运行的时候才会报错
好处是灵活,坏处是不容易在开发的时候发现错误、并且性能低

如果dynamic指向System.Dynamic.ExpandoObject()对象,这样可以给对象动态赋值属性(不能指向方法):

dynamic p = new System.Dynamic.ExpandoObject();
p.Name = "rupeng.com";
p.Age = 10;
Console.WriteLine(p.Name+","+p.Age);

var

var类型推断

var i = 3;
var s ="abc";

编译器会根据右边的类型推断出var是什么类型

var和dynamic的区别:

  • var是编译的时候确定的,dynamic是在运行的时候动态确定的
  • var变量不能指向其他类型,dynamic可以(因为var在编译的时候已经确定了类型)

匿名类型

匿名类型是C#中提供的一个新语法:

var p = new {Age=5,Name="rupeng.com"};//这样就创建了一个匿名类的对象,这个类没有名字,所以叫匿名类

原理:
编译器生成了这个类,这个类是internal、属性是只读的、初始值是通过构造函数传递的

  • 因为匿名类的属性是只读的,所以匿名类型的属性是无法赋值的;
  • 因为匿名类型是internal,所以无法跨程序集访问其成员(只能活在自己当前的程序集内)。

部分视图

在Asp.net mvc 的视图里有多种方法可以来加载部分视图,这几种方法是:

Partial()
Action()
RenderPartial()
RenderAction()
RenderPage()

为什么会有这么多方法,且这些方法有什么样的差别?

Partial 与 RenderPartial

  1. Razor 语法:@Html.Partial() 与 @{Html.RenderPartial();}

  2. 区别:
    Partial 可以直接输出内容,它内部是将 html 内容转换为 string 字符(MVCHtmlString),然后缓存起来,最后再一次性输出到页面。所以,这个转换的过程会降低效率,建议使用 RenderPartial 这处方法来代替。

RenderPartial 与 RenderAction

  1. Razor 语法:@{Html.RenderPartial();} 与 @{Html.RenderAction();}

  2. 区别:

    RenderPartial 方法是不需要创建 Controller 控制器中 的 Action 方法,而 RenderAction 方法则需要在 Controller 创建要加载的 Action。RenderAction 会先去调用 Contorller 的 Action ,最后再呈现视图,所以这里页面会在发起一个链接。

    如果这个部分视图只是一些简单 的 html 代码,请使用 RenderPartial。 但如果这个部分视图除了有 html 代码外,还需要通过 读取数据库中的数据来渲染,就必须使用 RenderAction 了,因为它可以在 Action 里调用 Model里的方法读取数据库,渲染到视图后再呈现,而 RenderPartial 没有 Action,所以无法做到。

RenderAction 与 Action

  1. Razor 语法:@{Html.RenderAction();} 与 @Html.Action();

  2. 区别:

    Action 也是直接输出,和 Partial 一样,也存在一个转换的过程。但不如 RenderAction 直接输出到当前HttpContext 的效率高。

RenderPage 与 RenderPartial 方法

  1. Razor 语法:@{Html.RenderPartial();} 与 @RenderPage()

  2. 区别:也可以使用 RenderPage 来呈现部分,但它不能使用原来视图的 Model 和 ViewData ,只能通过参数来传递。而 RenderPartial 可以使用原来视图的 Model 和 ViewData。

相关文章:

  • java基础巩固-宇宙第一AiYWM:为了维持生计,虽然咱没机会经历双11这种技术阅兵场,但是看看人家写的阅兵场日记,先xiao习xiao习一下嘛~整起
  • Mybatis配置详解 | 深入理解 『带上CSDN一起玩转国庆』
  • 断断续续学习算法的5年
  • Qt 精确定时器
  • mysql中int(11)与int(1)的区别与联系
  • 【Vue】Vue的v-for指令
  • 【Hadoop---09】MapReduce:MapReduce概述
  • 黑马旅游网-配置项目(一)
  • 【C语言】continue 关键字
  • java基于springboot+Vue+nodejs的高校网上二手闲置跳蚤市场 element
  • JAVA计算机毕业设计超市进销存管理系统Mybatis+系统+数据库+调试部署
  • Java中ArrayList对象中trimToSize()方法具有什么功能呢?
  • B01-快速入门CSS
  • makefile的基础规则与命名方式
  • 自动驾驶仿真:角雷达坐标系转换详解
  • hexo+github搭建个人博客
  • [NodeJS] 关于Buffer
  • 【前端学习】-粗谈选择器
  • docker python 配置
  • es6
  • linux安装openssl、swoole等扩展的具体步骤
  • nodejs实现webservice问题总结
  • WePY 在小程序性能调优上做出的探究
  • 关于for循环的简单归纳
  • 悄悄地说一个bug
  • 小程序开发之路(一)
  • 字符串匹配基础上
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​渐进式Web应用PWA的未来
  • "无招胜有招"nbsp;史上最全的互…
  • # Panda3d 碰撞检测系统介绍
  • #git 撤消对文件的更改
  • #前后端分离# 头条发布系统
  • (poj1.2.1)1970(筛选法模拟)
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (离散数学)逻辑连接词
  • (学习日记)2024.01.09
  • (转)Mysql的优化设置
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET : 在VS2008中计算代码度量值
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET gRPC 和RESTful简单对比
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中创建支持集合初始化器的类型
  • .NET下的多线程编程—1-线程机制概述
  • .Net语言中的StringBuilder:入门到精通
  • @ConfigurationProperties注解对数据的自动封装
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [Android] Amazon 的 android 音视频开发文档
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [BROADCASTING]tensor的扩散机制
  • [BZOJ 2142]礼物(扩展Lucas定理)