วัตถุประสงค์ของ ActionName


87

ประโยชน์ของการตั้งชื่อแทนสำหรับวิธีการดำเนินการโดยใช้แอตทริบิวต์ "ActionName" คืออะไร ฉันไม่เห็นประโยชน์ของมันมากนักในการให้ผู้ใช้มีตัวเลือกในการเรียกวิธีการดำเนินการด้วยชื่ออื่น หลังจากระบุนามแฝงแล้วผู้ใช้สามารถเรียกใช้วิธีการดำเนินการได้โดยใช้นามแฝงเท่านั้น แต่ถ้าจำเป็นต้องใช้เหตุใดผู้ใช้จึงไม่เปลี่ยนชื่อของวิธีการดำเนินการแทนที่จะระบุนามแฝง

ฉันจะขอบคุณมากถ้าใครสามารถให้ตัวอย่างการใช้ "ActionName" ในสถานการณ์ที่สามารถให้ประโยชน์ที่ดีเยี่ยมหรือควรใช้ให้ดีที่สุด


สาเหตุส่วนใหญ่คือเมื่อคุณมีทั้งวิธี GET และ POST และลายเซ็นเหมือนกัน ดูคำตอบของ @Carlos Muñoz
RickAndMSFT

คำตอบ:


132

ช่วยให้คุณสามารถเริ่มการกระทำของคุณด้วยตัวเลขหรือรวมอักขระใด ๆ ที่. net ไม่อนุญาตในตัวระบุ - สาเหตุที่พบบ่อยที่สุดคืออนุญาตให้คุณมีการดำเนินการสองอย่างที่มีลายเซ็นเดียวกัน (ดูการดำเนินการ GET / POST ลบของตัวควบคุมนั่งร้านใด ๆ )

ตัวอย่างเช่นคุณสามารถอนุญาตให้มีขีดกลางภายในชื่อการกระทำ URL ของคุณhttp://example.com/products/create-productเทียบหรือhttp://example.com/products/createproducthttp://example.com/products/create_product

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

46
นอกจากนี้ยังให้คุณใช้ชื่อการดำเนินการที่อาจเป็นวิธีการControllerเช่น View หรือ File
กรัม

@gram เราไม่สามารถเรียกเมธอดปกติบนคอนโทรลเลอร์โดยไม่ระบุนามแฝงได้หรือไม่? ฉันคิดว่าเราทำได้
Hasan Fahim

2
หากคุณต้องการตั้งชื่อของAction View()คุณแสดงว่าคุณมีปัญหาเนื่องจากการอ้างอิงทั้งหมดView()ในตัวควบคุมปัจจุบันของคุณจะแก้ไขปัญหานั้นActionแทนที่จะเป็นวิธีการพื้นฐาน เพื่อหลีกเลี่ยงสิ่งนี้คุณจะใช้ActionNameแอตทริบิวต์เพื่ออนุญาตให้Viewดำเนินการ แต่ภายในคุณจะเรียกมันPublicViewหรือสิ่งที่คล้ายกัน
เริ่มสร้าง

2
ฉันคิดว่าคุณจะต้องreturn View("CreateProduct")หรือ. NET จะจู้จี้ที่ไม่พบมุมมองเช่นcreate-product.aspxหรือcreate-product.cshtml- อย่างน้อยรหัสของฉันก็ทำงานเช่นนี้
Achilles

@gram แล้วคุณจะทำอย่างไร? ไม่เห็นได้ชัดว่ามีแอตทริบิวต์
John

61

นอกจากนี้ยังมีประโยชน์หากคุณมีการดำเนินการสองรายการที่มีลายเซ็นเดียวกันซึ่งควรมี URL เดียวกัน

ตัวอย่างง่ายๆ:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

มีเหตุผล แต่ในสถานการณ์ใดที่คุณใช้ HttpPost โดยไม่มีพารามิเตอร์ ฉันรู้ว่ามีสาเหตุที่เป็นไปได้เช่นส่งคืน JSON และหลีกเลี่ยงปัญหาด้านความปลอดภัยกับ GET ฉันแค่สงสัยว่าของคุณคืออะไร
regularmike

2
รายการพารามิเตอร์ไม่ใช่ส่วนสำคัญที่นี่ อาจมีตัวอย่างที่ดีกว่าประเด็นก็คือคุณสามารถทำได้หากต้องการ
Carlos Muñoz

1
เราสามารถทำได้โดยการแทนที่ "SomeActionPost" เป็น "SomeAction" ด้วยแล้วการใช้ ActionName คืออะไร ??
Jilani pasha

คุณไม่สามารถตั้งชื่อวิธีการทั้งสองเหมือนกันได้หากมีพารามิเตอร์เดียวกัน ในกรณีนี้ [ActionName] จะเปลี่ยนชื่อการกระทำ (ไม่ใช่วิธีการ) ตามที่ลงทะเบียนไว้ใน ASP NET MVC เส้นทางไปยังตารางที่ต้องการ
Carlos Muñoz

38

ฉันใช้เมื่อผู้ใช้ดาวน์โหลดรายงานเพื่อให้สามารถเปิดไฟล์ csv ลงใน Excel ได้โดยตรงอย่างง่ายดาย

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

2
ฉลาดมาก :)
SRQ Coder

2

ลองใช้รหัสนี้:

public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

1

คลาสนี้แสดงถึงแอตทริบิวต์ที่ใช้สำหรับชื่อของการกระทำ นอกจากนี้ยังอนุญาตให้นักพัฒนาใช้ชื่อการดำเนินการอื่นนอกเหนือจากชื่อวิธีการ


0

นอกจากนี้ยังมีประโยชน์เมื่อคุณต้องใช้วิธีการมากเกินไป

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`

ที่นี่ ActorView ตัวหนึ่งไม่ยอมรับพารามิเตอร์และอีกอันยอมรับ int วิธีแรกที่ใช้ในการดูรายชื่อนักแสดงและอีกวิธีหนึ่งใช้สำหรับแสดงรายชื่อนักแสดงคนเดียวกันหลังจากลบรายการที่มี ID เป็น 'id' คุณสามารถใช้ชื่อการดำเนินการเป็น 'ActorViewOverload' ได้ทุกที่ที่คุณต้องการวิธีการโอเวอร์โหลด

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