ฉันจะกำหนดวิธีในมีดโกนได้อย่างไร


213

ฉันจะกำหนดวิธีในมีดโกนได้อย่างไร


1
สำหรับผู้ที่ต้องการดูว่ามีตัวเลือกอะไร: มีสองวิธีในการทำ หนึ่ง. ใช้ "@function" และอีกอันใช้ "@helper" ความแตกต่างระหว่างพวกเขาอธิบายไว้ที่นี่อย่างดี mikesdotnetting.com/article/173/…
b1k

คำตอบ:


310

ออกจากการโต้วาทีอย่างถี่ถ้วนเมื่อใด (ถ้าเคย) ควรทำ@functionsเป็นวิธีที่คุณทำ

@functions {

    // Add code here.

}

16
+1 ขอบคุณ FYI มันเรียกว่าการปฏิบัติจริง MVC ไม่ใช่เกมเดียวในเมือง คนบางคนเช่นมีดโกนที่เรียบง่ายและ URLRewrite เป็น MVC เป็นจำนวนมากที่ต้องทำเพื่อประโยชน์ IMO น้อย
Jason Sebring

5
@functionsเป็นสถานที่ที่ดีในการจัดระเบียบรหัสการดูเฉพาะ กรณีตรงประเด็น: แม่แบบไคลเอนต์ที่น่าเกลียดเหล่านั้นจากสตริง ..
2864740

1
สวัสดีเดวิดฉันจะกำหนดฟังก์ชั่นในไฟล์เดียวและใช้ในไฟล์อื่นได้อย่างไร?
Georgi Kovachev

Georgi นี่เรียกว่า "มีดโกน HTML Helper" โดยทั่วไปคลาสที่กำหนดไว้ในโฟลเดอร์ Code ของคุณพร้อมชุดวิธีการคงที่ตามที่แนะนำไว้ที่นี่: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Georgi คุณอาจจะเจอสิ่งนี้ในตอนนี้ ... แต่สำหรับการใช้ <code> @functions </code> หรือ <code> @helper </code> ตัวเลือกมีดโกนคุณสามารถใช้ไฟล์เช่น Shared.cshtml ใน App_Code ของคุณ โฟลเดอร์ ในนั้นคุณสามารถกำหนด <code> @functions {} </code> หรือ <code> @helper MyFunction () {} </code> และใช้ในเทมเพลตมีดโกนอื่น ๆ ของคุณเช่น <code> @ Shared.MyFunction () < / code> โดยที่ชื่อของไฟล์นั้นเหมือนกับ "namespace"
Jamie Altizer

194

คุณหมายถึงผู้ช่วยแบบอินไลน์หรือไม่

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")

4
ฉันต้องการกำหนดวิธีการที่ส่งคืนไม่ใช่ MvcHtmlString แต่เป็นประเภท C #
Rookian

4
@Rookian ทำไมคุณถึงต้องเขียนโค้ด C # ในมุมมองล่ะ ฉันหมายถึงวิธีการเขียนในมุมมองเป็นสิ่งที่ผิด! คุณสามารถเขียนโค้ด C # ของคุณได้อย่างสมบูรณ์ทุกที่ที่เป็นของแล้วเรียกใช้วิธีการในมุมมองมีดโกนและนั่นคือสิ่งที่ผู้ช่วย HTML ทำ และพวกเขาไม่ควรที่จะกลับมาเป็น MvcHtmlString เสมอ
ดารินทร์ดิมิทรอฟ

1
@Rookian บางทีคุณสามารถอธิบายสิ่งที่คุณพยายามทำตั้งแต่แรก สิ่งที่เป็นผมมั่นใจว่ามีวิธีที่ดีกว่าที่จะทำมันมากกว่าการเขียนรหัส C # ในมุมมอง :-)
ดารินทร์ดิมิทรอฟ

1
นี่มันเจ๋งมาก! ขอบคุณดารินทร์ ... เมื่อฉันคิดว่าฉันรู้ทุกอย่างเกี่ยวกับ MVC แล้วคุณจะได้เรียนรู้สิ่งใหม่ :)
Serj Sagan

3
ASP.NET Core ที่เทียบเท่าคือตัวช่วยเหลือแท็ก: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol

34

มันง่ายมากที่จะกำหนดฟังก์ชั่นภายในมีดโกน

@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 ในขณะที่ประเภทส่งคืนสำหรับฟังก์ชันเป็นสิ่งที่คุณต้องการให้เป็น


2
ฟังก์ชั่นการโทรโดยไม่ต้องใส่@Functionsคำเสริมหน้าให้@OrderedList(...)เหมาะกับฉันใน. netcore
Muflix

12

คุณสามารถทำได้ด้วย 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>

10

มีดโกนเป็นเพียงเครื่องยนต์ templating

คุณควรสร้างคลาสปกติ

หากคุณต้องการที่จะทำให้ภายในวิธีของหน้ามีดโกนใส่ไว้ในบล็อก@functions


1

คุณสามารถประกาศให้พวกเขาเป็นฟังก์ชั่นท้องถิ่นในบล็อกมีดโกน (เช่น@{})

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>

0

คุณยังสามารถใช้@{ }บล็อกเพื่อสร้างฟังก์ชั่น:

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

จากนั้นในหน้ามีดโกนของคุณ:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

0

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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.