前些天,项目组将项目从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. ssh命令:隧道代理+本地端口转发+远程端口转发

        0.前言 nc是一个在网络连接两端的好工具,同时也是也个临时的端口转发的好工具.(永久的端口转发用什么?用iptables) ssh也是这方面的好工具,好处是加密可靠可复用在一端操作即可,代价 ...

  2. 利用iptables来配置linux禁止所有端口登陆和开放指定端口

    from:http://www.myhack58.com/Article/sort099/sort0102/2011/31781.htm 1.关闭所有的 INPUT FORWARD OUTPUT 只对 ...

  3. javascript 笔记(1)

    document.forms[0].names.value == '' forms[0]表示文档的第一个 form 表单,names 表示这个表单元素名为 names 的表单的元素,此时表示的是获取此 ...

  4. ASP.net+MVC--2

    1.ASP.NET MVC控制器 1)在Controllers文件夹下新建控制类 public class HelloWorld2Controller : Controller { public st ...

  5. php不允许用户提交空表单(php空值判断)

    我们在设计提交空的评论时依然可以写入数据库,并在页面显示出来.这显然是不合理的,所以需要我们加入空值判断 可以修改代码,添加些判断: 复制代码代码如下:   if(empty($_POST['name ...

  6. javascript进阶——面向对象特性

    面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...

  7. hadoop2.610集群配置(包含HA和Hbase )

    .修改Linux主机名2.修改IP3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机等)/etc/hosts里面要配置的是内 ...

  8. lucene 实现word,pdf全文检索源码

    创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...

  9. Forget asp.net membership,ASP.NET Identity Overview

    http://www.asp.net/identity http://www.asp.net/identity/overview/getting-started/introduction-to-asp ...

  10. nvarchar类型自动增长

    ,Col AS 'XH' + RIGHT('0000' + RTRIM(ID),4)