前些天,项目组将项目从mvc3升级至mvc4,完了之后,发现突然涌现出一大堆问题。主要是在前端,Razor引擎升级导致的。

Razor是从mvc3开始引入的,用过mvc2的就会知道,Razor用起来确实是灰常爽的(Razor意为"剃、剃刀",看着就有一种犀利的感觉),mvc4对Razor进行了升级。

mvc4中,一些Razor的写法得到了简化,例如在mvc3中,引用外部样式文件我们会用:

<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />

而在mvc4中,只需这样写就可以了(暂时忽略Styles.Render()):

<link href="~/Content/Site.css" rel="stylesheet" type="text/css" />

给个大大的!!

简写给开发带来便利,可是一不小心,很容易就会出错,例如以下我们遇到最多的问题——

先看看mvc4,属性值使用@true/fakse写法Render出来的效果与mvc3的不同:

<label><input type="checkbox" checked="@true" />checked</label>
<label><input type="checkbox" checked="@false" />uncheck</label>
<label><input type="radio" checked="@true" />checked</label>
<label><input type="radio" checked="@false" />uncheck</label>

看看生成的代码:

mvc3中,会直接将值Render出来,而浏览器对于是否checked状态的判断是看这个标签是否有checked属性,并不会去判断值是什么。所以在mvc3中,看到的是所有checkbox/radio都是checked状态的。

而mvc4中,Razor渲染前会先判断值,若为null或false,则这个属性不会被Render出来,为true,则会被Render出来,且值为属性名

这种效果很爽,以后写checkbox或是radio就不需要先判断是否checked状态了。同样的,readonly、disabled... 也有相同效果。

另外,注意的是,这种效果对于data-*属性没效果,即:

<label attr1="@true" attr2="@false" attr3="" attr4="@null" data-test1="@true" data-test2="@false">test</label>

Razor Render出来的结果是:

(mvc4,注意,attr3="",这里值是长度为0的字符串,并非null)

我们之前有部分代码是这样写的:

@{
var parameter1 = true;
var parameter2 = false;
}
<a href="javascript:Reload('@parameter1', '@parameter2')">reload</a>

在mvc3中,这样Render出来的结果是正确的,然而在mvc4中,却出来这样的结果:

parameter1的值为true,所以Render为所在属性的属性名href;parameter2的值为false,Render为长度为0的字符串。

需改成这样写就可以了:

<a href="javascript:Reload('@parameter1.ToString()', '@parameter2.ToString()')">reload</a>

Razor会对boolean类型进行判断处理,但对string不会先进行判断处理。

记录一次MVC3升级MVC4遇到的问题的更多相关文章

  1. mvc3升级mvc4的方法记录.

    手工升级ASP.NET MVC 3项目: 一.安装ASP.NET MVC 4 二.升级ASP.NET MVC版本配置信息: 1:替换项目 Web.config 中的 System.Web.Mvc, V ...

  2. BrnShop mvc3升级mvc4

    此文来自:http://www.cnblogs.com/fumj/p/3588517.html 手工升级ASP.NET MVC 3项目: 一.安装ASP.NET MVC 4 二.升级ASP.NET M ...

  3. ASP.NET MVC3升级到ASP.NET MVC4 的方法

    ASP.NET MVC3升级 ASP.NET MVC4 的方法: 1.先去掉引用的System.Web.Mvc.dll(MVC3版本),重新引入System.Web.Mvc.dll(MVC4版本) 2 ...

  4. MVC3升级到MVC4模型验证信息显示为英文问题及解决方案

    最近把项目从mvc3升级到mvc4,部署到服务器上出现了一个小问题,就是在表单里字段验证时,验证显示信息为英文,如下: The field 平均租金 must be a number 而在本地是好的, ...

  5. MVC3和MVC4相关问题

    从TFS获取的MVC项目生成一直提示这个错误,我的VS中MVC3和MVC4都有,TFS项目中的MVC版本应该是MVC3的,现在我要用这个项目,但是一直是这个错误,请高手指点,积分不多了,见谅 程序集“ ...

  6. MVC3升级为MVC4

    在程序包管理控制台输入 Install-Package UpgradeMvc3ToMvc4 等待 升级完成

  7. 【MVC版本】MVC3、MVC4之MODEL验证大比拼

    1.密码验证 MVC3 [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = &quo ...

  8. MVC3迁移MVC4相关问题

    mvc3迁移到mvc4后,发布到服务器,出现了如下错误: [A]System.Web.WebPages.Razor.Configuration.RazorPagesSection cannot be ...

  9. MVC2、MVC3、MVC4、MVC5之间的区别 以及Entity Framework 6 Code First using MVC 5官方介绍教程

    现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Eng ...

随机推荐

  1. 深入了解line-height

    1.定义   行高:两行文字baseline(基线)之间的距离 示意图: 2.为何line-height可以让单行文本垂直居中       其实并没有垂直居中,除非将font-size:0; 3.li ...

  2. input表单

    submit:点击submit按钮表单就会被提交给服务器,中文IE下默认按钮文本为“提交查询”,可以设置value属性修改按钮的显示文本 text:size属性为宽度,value为值,maxlengt ...

  3. Linux - tar命令过滤某个目录

    tar -zcvf abc.20140325.tar.gz --exclude=./abc/kkk/--exclude=./abc/hhh/ ./abc/ 发现没有过滤成功,后来发现这种方法是不对的( ...

  4. 网易邮箱前端Javascript编码规范:基础规范

    在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享.今天想先和大家聊 ...

  5. centos nginx

    1.关闭SELinux 查看SELinux状态: (1)/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: ...

  6. 64位AutoItLibrary的安装

    安装AutoItLibrary,除了要先已经安装好Robotframework之外,先要安装一个叫pywin32的工具 第一步:pywin32的安装 pywin32的下载地址: http://sour ...

  7. WPF的依赖属性

    Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...

  8. C语言学习笔记——堆和栈——未整理

    C语言笔记     栈区     栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.出入栈是由C语言编译器自动分配 ...

  9. GPUImage 滤镜头文件

    #import "GLProgram.h" // Base classes #import "GPUImageOpenGLESContext.h" #impor ...

  10. SQL操作(增删改查)

    1.一些重要的SQL命令: SELECT - 从数据库中提取数据UPDATE - 更新数据库中的数据DELETE - 从数据库中删除数据INSERT INTO - 向数据库中插入新数据CREATE D ...