在DAY 8的時候介紹過HTML Helper的用法,除此之外還有一些helper可以讓我們更方便與彈性地編排View內容,接著就來一一說明。
有的時候我們在撰寫View的頁面仍會需要處理簡單邏輯判斷,以動態顯示內容。例如下方Code在foreach
迴圈內用了if
判斷要顯示的票種,我們則可以將這些邏輯包裝成@helper
方法,除了可以重複使用外,相對可以讓程式碼變得簡潔明瞭些。
public ActionResult Index()
{
var members = new List<Member>();
members.Add(new Member { Id = 1, Name = "Amy", Age = 14 });
members.Add(new Member { Id = 2, Name = "Bob", Age = 66 });
members.Add(new Member { Id = 3, Name = "Carol", Age = 35 });
members.Add(new Member { Id = 4, Name = "Dustin", Age = 5 });
return View(members);
}
@model IEnumerable<DemoActionResult.Models.Member>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<div class="col-md-6" style="display:flex">
<table class="table-bordered table">
<tr>
<th>票種</th>
<th>年齡限制</th>
</tr>
<tr>
<td>全票</td>
<td>18歲以上,65歲以下</td>
</tr>
<tr>
<td>半票</td>
<td>6歲以上,未滿18歲</td>
</tr>
<tr>
<td>免票</td>
<td>滿65歲以上或未滿6歲</td>
</tr>
</table>
</div>
<div style="display:grid">
@foreach (var member in Model)
{
<ul>
<li>ID: @member.Id</li>
<li>Name: @member.Name</li>
<li>Age: @member.Age</li>
@{
if (member.Age >= 65 || member.Age < 6)
{
<li>票種: 免票</li>
}
else if (member.Age >= 18)
{
<li>票種:全票</li>
}
else
{
<li>票種:半票</li>
}
}
</ul>
<hr />
}
</div>
改寫的方式類似C#的方法,可以在該View的底下任一行以@helper
開頭,自訂方法名稱與參數,並撰寫相關邏輯內容。叫用方法時以@
開頭輸入方法名稱與參數即可使用,範例如下Code:
...
...
...
<div style="display:grid">
@foreach (var member in Model)
{
<ul>
<li>ID: @member.Id</li>
<li>Name: @member.Name</li>
<li>Age: @member.Age</li>
@GetTicketType(member.Age)
</ul>
<hr />
}
</div>
@helper GetTicketType(int age)
{
if (age >= 65 || age < 6)
{
<li>票種: 免票</li>
}
else if (age >= 18)
{
<li>票種:全票</li>
}
else
{
<li>票種:半票</li>
}
}
上述的@helper
方法僅能在該檢視頁面中使用,如果要讓整個專案都能使用的話需要進行以下步驟:
新增App_Code資料夾
加入MVC5檢視頁面(Razor)
自訂helper寫於該檢視頁面
叫用方法時前面須加上檢視頁面名稱
雖然我們已經有許多HTML Helper方法來幫助撰寫HTML內容,但總是會有無法滿足需求的情況,當既有的HTML Helper方法沒有辦法產生我們要的標籤時,例如想產生<img>
標籤與屬性可以如何做呢?其中一種方式就是自訂HTML Helper,參考下列步驟進行:
MyHtmlHelper
類別(可自行命名)並宣告為static
Image()
方法,注意幾個重點:static
this HtmlHelper
MvcHtmlString
才會自動編譯HTML格式 public static class MyHtmlHelper
{
public static IHtmlString Image(this HtmlHelper helper,string url,string alt="找不到圖片")
{
//using System.Web.Mvc;
return new MvcHtmlString($@"<img src={url} alt={alt} />");
}
}
@Html.Image("https://picsum.photos/536/333")
當自訂HTML Hepler時,如果不想在回傳字串直接用HTML標籤格式,還有另一種物件化的方式來產生:Tag Builder。假如同樣想產生一個<img>
標籤,利用Tag Builder的寫法可以參考下面Code:
public static MvcHtmlString Image(this HtmlHelper helper,string url,string alt,string id)
{
//產生新的 TagBuilder 物件,並設定標籤為<img>
var builder = new TagBuilder("img");
//賦予id屬性值
builder.GenerateId(id);
//加入屬性
builder.MergeAttribute("src", url);
builder.MergeAttribute("alt", alt);
//指定標籤為自我結束格式 <img ... />
var result = builder.ToString(TagRenderMode.SelfClosing);
return new MvcHtmlString(result);
}
以上就是一些helper相關的補充內容,明天我們來講講JSON資料格式,那麼就明天見囉~