記錄一次MVC3升級MVC4遇到的問題

前些天,項目組將項目從mvc3升級至mvc4,完了以後,發現忽然涌現出一大堆問題。主要是在前端,Razor引擎升級致使的。javascript

Razor是從mvc3開始引入的,用過mvc2的就會知道,Razor用起來確實是灰常爽的(Razor意爲"剃、剃刀",看着就有一種犀利的感受),mvc4對Razor進行了升級。css

 

mvc4中,一些Razor的寫法獲得了簡化,例如在mvc3中,引用外部樣式文件咱們會用:前端

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

而在mvc4中,只需這樣寫就能夠了(暫時忽略Styles.Render()):java

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

給個大大的!!瀏覽器

 

簡寫給開發帶來便利,但是一不當心,很容易就會出錯,例如如下咱們遇到最多的問題——mvc

先看看mvc4,屬性值使用@true/fakse寫法Render出來的效果與mvc3的不一樣:spa

<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>

看看生成的代碼:code

mvc3中,會直接將值Render出來,而瀏覽器對因而否checked狀態的判斷是看這個標籤是否有checked屬性,並不會去判斷值是什麼。因此在mvc3中,看到的是全部checkbox/radio都是checked狀態的。blog

而mvc4中,Razor渲染前會先判斷值,若爲null或false,則這個屬性不會被Render出來,爲true,則會被Render出來,且值爲屬性名ip

這種效果很爽,之後寫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不會先進行判斷處理。

相關文章
相關標籤/搜索