嘗試Razor


  在幾個月以前寫了一篇關於ASP.NET的MVC的博文,當時的視圖沒有用Razor,有園友說了Razor的好處,時隔多月之后,這回體驗一下用Razor,Razor的一個特征就是@,通篇的@,不過這個@的簡便性比ASPX好,寫上去方便,看上去也整潔。

1.Razor基礎語法

 

@***

  首先最簡單的就是利用@*** 輸出某個非字面值,這個就相當於ASPX<%= %>,例如輸出這個系統的當前時間@DateTime.Now

在頁面上的結果是

  如果是一個字段的話,也是可以用這種方式,可是對於一個字面值例如一個字符串”Hello world”,或布爾值true或整數1來說,@”Hello world”是不行的。這時就要用另一種形式。

 

@(……..)

  @(……..)這種形式能輸出字面值,它能對括號里面的內容經行編碼,就算里面的內容是一個字符串”<br/>”,它輸出的只是一個字符串”<br/>”,而不是html中的換行。包括上面的@***也是一樣,如果一個字符串類型的字段s,它的值是”<br/>”,當@s的時候,結果只是一個字符串”<br/>”,而不是換行。看看生成的html就知道了。

對於以下代碼(s是已經定義了)

@("<br/>")

<br/>
<br/>

@s

頁面上的結果

 

生成的html

  顯然,在生成html的時候,把@(“<br/>”)和@s都以字符串的形式(“<br/>”)寫到生成的html,而不是單純的標記形式(<br/>)。這里其實和原本ASPX中的<%= %>輸出的道理是一樣的。

  說到這里,其實上面用“輸出”這個詞就不對了,不過給我的感覺就跟在控制台上輸出的效果一樣。

 

@{…….}

  接着就到語句塊,使用語句塊的是以這種形式@{},例如定義一個變量( @{string s=”Hello World”;} ),或者要循環執行一部分代碼,又或者需要進行一個判斷,就需要這語句塊了。也就在程序語言中的流程控制。

       這里就列舉了一個例子,是利用for循環輸出一個三角形

@{ int c = 0;}
@for (int i = 0; i < 10; i++)
{
    for (int j = 0; j <= i; j++,c++)
    {
          <span style="color:@(c%2==0?"red":"green");margin:5px;"> @(c+" ")</span>
    }
    <br />
}

這里用了@{....}和@(....),效果如下,數字是紅綠顏色交錯的。

還有另一個例子,是if-else 語句的,判斷當前時間,在不同時間段顯示不同的問候語

@if(DateTime.Now.TimeOfDay<new TimeSpan(12,0,0))
{    @("上午好!")}
else if (DateTime.Now.TimeOfDay < new TimeSpan(18, 0, 0))
{    @("下午好!")}
else
{   @("晚上好!")}

結果如下

  這里要注意下的是,在程序語言中if或者for下面的語句塊如果只有一條語句的話,花括號{} 可以省略,但是Razor不行,如果是這樣

@if(DateTime.Now.TimeOfDay<new TimeSpan(12,0,0))
    @("上午好!")

的話,會報錯的,不過在vs里面的提示也會看得出來。

 

@using

  上面的例子有用到一個System命名空間下的結構DateTime,如果現在想調用.net其他命名空間的類,當然可以用類的完全限定名,但是如果在反復使用的情況下,敲打類前面的命名空間這個工作量不小,Razor也可以跟cs文件里的那樣使用命名空間。

例如

@using System.Threading;


@DateTime.Now
<br/>
@{Thread.Sleep(1000);}
@DateTime.Now
<br/>
@{Thread.Sleep(3000);}
@DateTime.Now

結果如下

  當然我這里是為了舉例才用這個Thead的類,與cs文件里的不同,Razor的命名空間不一定全都要堆在文件的開頭。

母板頁

  在Razor中使用母板頁,也不會有之前ASPX那樣的master文件。與其他文件一樣都是cshtml后綴。在使用方面,在需要放子頁內容的地方調用@RenderBody()則可,這個就代替了原本在ASPX中的<asp:ContentPlaceHolder ID="MainContent" runat="server" />標簽了。在子頁方面,只需要放上這么一行代碼就行了@{Layout = "~/Views/Shared/MyLayout.cshtml";},這就說明了當前子頁要使用Mylayout這個模板頁,當前的子頁內容會插到母版頁的@RenderBody()中去。

先列舉一下母板頁的代碼

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <style type="text/css">
        input.btn{ background-color:Orange; color:White; font-weight:bold;}
    </style>
    <script type="text/javascript">
        $(function () {
            alert("hello world");
        });
    </script>
</head>

<body>
    <div>
    <span>
        This is a simple page
    </span>
    <ul>
        <li>
        <a href="#">Home</a>
        </li>
        <li>
         <a href="#">Register</a>
        </li>
    </ul>
    @RenderBody()
    </div>
</body>
</html>

子頁的代碼

@{
    Layout = "~/Views/Shared/MyLayout.cshtml";
    ViewBag.Title = "Test";
}
    id:<input type="text" />
    <br />
    password:<input type="password" />

效果圖

如果在母板頁中插入子頁的內容不止一個,那就要用另一種形式了

母板頁@RenderSection("標識符")

子頁@section 標識符{

    ……內容….

}

例子如下

母板頁

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <style type="text/css">
        input.btn{ background-color:Orange; color:White; font-weight:bold;}
    </style>
    <script type="text/javascript">
        $(function () {
            alert("hello world");
        });
    </script>
</head>

<body>
    <div>
    <span>
        This is a simple page
    </span>
    <ul>
        <li>
        <a href="#">Home</a>
        </li>
        <li>
         <a href="#">Register</a>
        </li>
    </ul>
    @RenderSection("login")
    </div>
    <div>
        @RenderSection("footer")
    </div>
</body>
</html>

子頁

@{
    Layout = "~/Views/Shared/MyLayout.cshtml";
    ViewBag.Title = "Test";
}
@section login{
    id:<input type="text" />
    <br />
    password:<input type="password" />
}

@section footer{
    <span>this is a footer</span>
}

結果

  在不確定子頁是否有實現某部分的內容時,可以調用IsSectionDefined(“標識符”)作一個判斷,如果有則引用子頁的相應內容,如果沒有可以做一些默認的操作

例如

    @if (IsSectionDefined("footer"))
    {@RenderSection("footer")}
    else { 
        <span>defalut footer</span>
    }

 

使用行為方法傳來的模型

  利用@Model可以獲取到一個Action中傳來的對應的模型,它是一個只讀的屬性。從這個屬性獲取的實例要從Controller進行傳輸,如果沒有則“Model”將為null。獲取了這個實例之后就可以訪問實例的字段,屬性調用它的方法等。

如這里簡單定義了一個模型

    public class TestModel
    {
        public int Number1{get;set;}

        public int Number2 { get; set; }

        public int Sum { get { return Number1 + Number2; } }

        public int AddOuter(int num1, int num2)
        {
            return num1 + num2;
        }
    }

控制器的行為方法如下,就構造了一個模型的實例,給它兩個數字賦了值,最后傳到視圖中去。

        public ActionResult TestPage()
        {
            TestModel model = new TestModel();
            model.Number1 = 1;
            model.Number2 = 2;
            return View(model);
        }

最后在視圖上就可以通過@Model來獲取該實例了。

Model.Sum= @Model.Sum
<br />
Now  Model.Number1 = 3  Model.Number2 = 2; 
@{
    Model.Number1 = 3;
    Model.Number2 = 2;   
 }
 <br />
Model.Sum= @Model.Sum

 <br />

Model.AddOuter(10, 20) @Model.AddOuter(10, 20)

結果如下

2.Html的表單元素的應用

接下來介紹一下一些Html的表單元素在Razor

Label

  Label有兩個方法,一個是Label(“expression”),另一個是Label(“expression”,”labelText”),Label標簽有個for屬性,expression參數的值就是for屬性的值,labelText是label的內容,是經過編碼的,不能成為一個真正的層

例如

@Html.Label("Hello world")
<br />
@Html.Label("hello world","<div>label text</div>")
<label><div>text</div></label>

生成的html如下

 

TextBox

TextBox有以下幾個重載個方法

TextBox(string name)
TextBox(string name, object value)
TextBox(string name, object value, IDictionary<string, object> htmlAttributes)
TextBox(string name, object value, object htmlAttributes)

由參數的名稱都可以看出用途了

這里列舉一個帶樣式的textbox例子

@Html.TextBox("textBox1","value",new { style = "font-size:15px; color:red;"})

生成的html如下

<input id="textBox1" name="textBox1" style="font-size:15px; color:red;" type="text" value="value"/>

  文本框肯定是一個input標簽的最后一個參數是傳遞html屬性的,那么input標簽的屬性有type、name、id這些,我經過嘗試在最后一個參數中傳遞了一下屬性

type="password",value="123456",name="textbox2",id="textbox3"

發現成功的有type、id,文本框變成了一個密碼框了,但是value和name確改不成功。

 

DropDownList

DropDownList最簡單的一個方法是DropDownList( string name),可是我使用的時候老是有這個異常

  There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key

發現最簡單能用的就這樣了

@Html.DropDownList("ddl1", new List<SelectListItem>(),)

不過這樣生成DropDownList沒有默認值,如果要有默認值則用下面這種形式

@Html.DropDownList("ddl1", new List<SelectListItem>(), "-- 請選擇 --")

它就生成這樣的html

<select id="ddl1" name="ddl1">
     <option value="">-- 請選擇 --</option>
</select>

第二個參數是一個泛型的SelectListItem列表,這個List只要能傳進來就可以了。

例如

@Html.DropDownList("ddl1", 
    new List<SelectListItem>() 
    {
        new SelectListItem() { Text="", Value="man"},
        new SelectListItem(){Text="", Value="woman"}
    },
    "-- 請選擇 --")

生成的html如下

<select id="ddl1" name="ddl1">
    <option value="">-- 請選擇 --</option>
    <option value="man"></option>
    <option value="woman"></option>
</select>

如果要增加一些html屬性的,就這樣子

@Html.DropDownList("ddl1",
    new List<SelectListItem>() 
    {
        new SelectListItem() { Text="", Value="man"},
        new SelectListItem(){Text="", Value="woman"}
    },
    "-- 請選擇 --", new { style = "font-size:14px; color: #00ffee;" })

 

 

 

  由於認識尚淺,故有什么說錯說漏的,請各位盡管的批,在下虛心接納,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM