ฉันจะกำหนดวิธีในมีดโกนได้อย่างไร
ฉันจะกำหนดวิธีในมีดโกนได้อย่างไร
คำตอบ:
ออกจากการโต้วาทีอย่างถี่ถ้วนเมื่อใด (ถ้าเคย) ควรทำ@functionsเป็นวิธีที่คุณทำ
@functions {
// Add code here.
}
@functions
เป็นสถานที่ที่ดีในการจัดระเบียบรหัสการดูเฉพาะ กรณีตรงประเด็น: แม่แบบไคลเอนต์ที่น่าเกลียดเหล่านั้นจากสตริง ..
คุณหมายถึงผู้ช่วยแบบอินไลน์หรือไม่
@helper SayHello(string name)
{
<div>Hello @name</div>
}
@SayHello("John")
มันง่ายมากที่จะกำหนดฟังก์ชั่นภายในมีดโกน
@functions {
public static HtmlString OrderedList(IEnumerable<string> items)
{ }
}
ดังนั้นคุณสามารถเรียกใช้ฟังก์ชันได้ทุกที่ ชอบ
@Functions.OrderedList(new[] { "Blue", "Red", "Green" })
อย่างไรก็ตามงานเดียวกันนี้สามารถทำได้ผ่านhelper
เกินไป ตัวอย่างเช่น
@helper OrderedList(IEnumerable<string> items){
<ol>
@foreach(var item in items){
<li>@item</li>
}
</ol>
}
แล้วอะไรคือความแตกต่าง ?? จากการโพสต์ก่อนหน้านี้ทั้ง @helpers และ @functions ทำสิ่งหนึ่งที่เหมือนกัน - พวกเขาทำให้โค้ดนำมาใช้ซ้ำได้ภายในเว็บเพจ พวกเขายังแบ่งปันสิ่งอื่นร่วมกัน - พวกเขาดูเหมือนกันในแวบแรกซึ่งเป็นสิ่งที่อาจทำให้เกิดความสับสนเล็กน้อยเกี่ยวกับบทบาทของพวกเขา อย่างไรก็ตามพวกเขาไม่เหมือนกัน โดยพื้นฐานแล้วตัวช่วยเป็นตัวอย่างข้อมูลของมีดโกน sytnax ที่สามารถนำกลับมาใช้ใหม่ได้และมีไว้สำหรับการแสดง HTML ไปยังเบราว์เซอร์ในขณะที่ฟังก์ชั่นเป็นวิธียูทิลิตี้แบบคงที่ที่สามารถเรียกได้จากที่ใดก็ได้ ประเภทส่งคืนสำหรับผู้ช่วยมักจะเป็น HelperResult ในขณะที่ประเภทส่งคืนสำหรับฟังก์ชันเป็นสิ่งที่คุณต้องการให้เป็น
@Functions
คำเสริมหน้าให้@OrderedList(...)
เหมาะกับฉันใน. netcore
คุณสามารถทำได้ด้วย Func เช่นนี้
@{
var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}
<div style="@getStyle(50, 2)"></div>
มีดโกนเป็นเพียงเครื่องยนต์ templating
คุณควรสร้างคลาสปกติ
หากคุณต้องการที่จะทำให้ภายในวิธีของหน้ามีดโกนใส่ไว้ในบล็อก@functions
คุณสามารถประกาศให้พวกเขาเป็นฟังก์ชั่นท้องถิ่นในบล็อกมีดโกน (เช่น@{}
)
@{
int Add(int x, int y)
{
return x + y;
}
}
<div class="container">
<p>
@Add(2, 5)
</p>
</div>
คุณยังสามารถใช้@{ }
บล็อกเพื่อสร้างฟังก์ชั่น:
@{
async Task<string> MyAsyncString(string input)
{
return Task.FromResult(input);
}
}
จากนั้นในหน้ามีดโกนของคุณ:
<div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
MyModelVm.cs
public class MyModelVm
{
public HttpStatusCode StatusCode { get; set; }
}
Index.cshtml
@model MyNamespace.MyModelVm
@functions
{
string GetErrorMessage()
{
var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
string errorMessage;
if (isNotFound)
{
errorMessage = Resources.NotFoundMessage;
}
else
{
errorMessage = Resources.GeneralErrorMessage
}
return errorMessage;
}
}
<div>
@GetErrorMessage()
</div>