วิธีสร้างฟังก์ชั่นในเทมเพลต cshtml


219

ฉันต้องการสร้างฟังก์ชั่นที่จำเป็นเฉพาะในไฟล์ cshtml เดียว คุณสามารถคิดว่าสถานการณ์ของฉันเป็นวิธีหน้า ASP.NET ซึ่งเป็นบริการเว็บขั้นต่ำที่นำมาใช้ในหน้าเพราะพวกเขาถูกกำหนดขอบเขตในหนึ่งหน้า ฉันรู้เกี่ยวกับผู้ช่วยเหลือ HTML (วิธีการขยาย) แต่ฉันต้องการฟังก์ชั่นของฉันในไฟล์ cshtml เพียงไฟล์เดียว ฉันไม่ทราบวิธีสร้างลายเซ็นฟังก์ชั่นภายในมุมมอง หมายเหตุ : ฉันใช้เครื่องยนต์เทมเพลตมีดโกน

คำตอบ:


279

คุณสามารถใช้คำสั่ง @helper Razor ได้:

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

จากนั้นคุณเรียกใช้เช่นนี้:

@WelcomeMessage("John Smith")

13
คุณไม่สามารถใส่แท็กภายใน@functionsวิธีการดังนั้นฉันชอบคำตอบนี้
jfren484

1
ใช่มันดีกว่าการประกาศฟังก์ชั่น ตรงไปข้างหน้ามากขึ้น
muglio

2
แต่คุณไม่สามารถคืนค่าตัวแปร (ดังนั้นฟังก์ชัน word)
Paul

@ พอลฉันไม่เข้าใจว่าคุณหมายถึงอะไร
Daniel Liuzzi

2
asp.net core รองรับ @helper หรือไม่
MuM6oJuM6o

411

ทำไมไม่เพียงแค่ประกาศฟังก์ชั่นนั้นในไฟล์ cshtml

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
สิ่งนี้ควรถูกทำเครื่องหมายเป็นคำตอบเนื่องจากคำสั่ง @functions ตรงตามข้อกำหนด OP โดยเฉพาะ คุณลักษณะ Helpers มีไว้สำหรับการใช้งานร่วมกันในไฟล์เทมเพลตหลายไฟล์โดยวางไฟล์ด้วย @helper directive ลงในไดเรกทอรี App_Code ในขณะที่คำสั่ง @functions อนุญาตให้ใช้ฟังก์ชันโดยเฉพาะเทมเพลตที่ประกาศ
Jon Davis

7
โปรดสังเกตว่าผู้ช่วยดูเหมือนจะส่งคืนสตริงเช่นเดียวกับผู้ช่วยมีดโกนคนอื่น ๆ ที่ทำไปแล้วและfunctionsวิธีการแก้ปัญหาจึงให้ความยืดหยุ่นมากขึ้นสำหรับประเภทการส่งคืน toher คำตอบทั้งสองได้รับ +1 ในหนังสือของฉันเนื่องจากเป็นทั้งข้อมูลที่เป็นประโยชน์
AaronLS

8
@AaronLS เพื่อความยุติธรรมผู้ช่วยจะไม่ส่งคืนสตริง แต่ IHtmlString ซึ่งดูแลการเข้ารหัส HTML สำหรับคุณและปกป้องแอปของคุณจากการโจมตี XSS ผู้ช่วยยังให้ความสะดวกสบายแก่คุณในด้านไวยากรณ์ของมีดโกนในตัวช่วยซึ่งคุณสูญเสียไปกับฟังก์ชั่น ในคำอื่น ๆเมื่อเทียบกับ<p>Welcome, @username.</p> return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");
Daniel Liuzzi

9
@helperแม้ว่าการใช้ในมุมมองเดียวจะไม่ทำให้สามารถใช้งานได้กับมุมมองอื่น ๆ เหตุผลที่ฉันชอบ @helper ดีกว่าคือคุณสามารถใส่ html ไว้ระหว่างเครื่องหมายปีกกาของคุณ @functionsไม่ได้ (ง่าย) ให้คุณทำอย่างนั้น
jfren484

5
เฉพาะสำหรับบันทึก: ทั้งสอง@helperและ@functionsสามารถแชร์ในหลาย ๆ มุมมองและทั้งคู่สามารถประกาศเป็นและใช้โดยมุมมองเดียว (และฉันพบว่ามีการใช้งานส่วนตัวสำหรับพวกเขาในสถานการณ์ที่แชร์ / เดี่ยว) IMHO ข้อแตกต่างในทางปฏิบัติเพียงอย่างเดียวคือความจริงที่ว่าตัวช่วยดูเพิ่ม syntactic sugar สำหรับส่งคืนโค้ด HTML ที่แสดงผล (หรือเหมาะสมกว่า, HelperResultอินสแตนซ์) ในขณะที่ฟังก์ชันมุมมองมักจะมีประโยชน์สำหรับการอ้างอิงหรือประเภทค่าง่าย ๆ
rsenna

25

หากวิธีการของคุณไม่ต้องส่งคืน html และต้องทำอย่างอื่นคุณสามารถใช้แลมบ์ดาแทนวิธีใช้ผู้ช่วยในมีดโกน

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
มันใช้งานได้ แต่มันไกลจากความเรียบง่าย หนังสือศักดิ์สิทธิ์ของฉันเรียบง่าย;) แต่ขอบคุณที่ให้ทางเลือก
Saeed Neamati

มันมีประโยชน์อย่างไรถ้าคุณต้องการเข้าถึงตัวแปรทั่วโลกของหน้าในฟังก์ชั่นของคุณมีวิธีอื่นที่จะทำเช่นนั้น? : /
Alexandre Daubricourt


1

หากคุณต้องการเข้าถึงตัวแปรทั่วโลกของหน้าคุณสามารถทำได้:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

ตั้งแต่ C # 7.0 นี่เป็นคำตอบที่ถูกต้องและเหมาะสมเท่านั้น GetLoadingState()นี่คือฟังก์ชั่นท้องถิ่น
Wolfrevo Cats
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.