รับและโพสต์ไปยังแอ็คชันคอนโทรลเลอร์เดียวกันใน ASP.NET MVC


92

ฉันต้องการให้การดำเนินการเดียวตอบสนองทั้ง Gets และ Posts ฉันลองทำดังต่อไปนี้

[HttpGet]
[HttpPost]
public ActionResult SignIn()

ดูเหมือนจะไม่ได้ผล ข้อเสนอแนะใด ๆ ?


2
เพื่ออธิบายปัญหา: การดำเนินการจะถูกละเว้น แต่ละแอตทริบิวต์จะไม่รวมวิธีการร้องขออื่น ๆ ทั้งหมดดังนั้นการดำเนินการจึงไม่ยอมรับวิธีการร้องขอใด ๆ เลย
Guffa

ใน ASP.NET MVC2 และ VisualStudio 2010 ตัวอย่างของ OP (ที่มี "[AcceptVerbs (HttpVerbs.Get)]" ฯลฯ ) จะให้ข้อผิดพลาดในการคอมไพล์: "Duplicate 'AcceptVerbs' attribute"
DaveD

4
@ เดฟคุณกำลังทำ[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]หรือ[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? ฉันไม่รู้อะไรเลยเกี่ยวกับคุณสมบัติเหล่านั้น แต่ถ้าคุณทำอย่างที่สองนั่นอาจเป็นสาเหตุที่ทำให้คุณได้รับข้อผิดพลาดนั้น
Jared

คำตอบ:


135

สามารถทำได้โดยใช้แอตทริบิวต์ AcceptVerbs มันดูละเอียดกว่าเล็กน้อย แต่ยืดหยุ่นกว่า

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}

เพิ่มเติมเกี่ยวกับMSDN


3
ใช่ แต่จะเกิดอะไรขึ้นถ้าเมธอดใช้พารามิเตอร์ (เช่น SignIn (พารามิเตอร์ SingInParams) ... สำหรับ GET จะถูกนำมาจาก URI (ดังนั้นต้องระบุ [FromUri]) และสำหรับ POST จะถูกนำออกจากร่างกาย (ดังนั้น [ ต้องระบุ
FromBody

64

การดำเนินการตอบสนองต่อทั้ง GET และ POST โดยค่าเริ่มต้นคุณจึงไม่ต้องระบุอะไรเลย:

public ActionResult SignIn()
{
    //how'd we get here?
    string method = HttpContext.Request.HttpMethod;
    return View();
}

ขึ้นอยู่กับความต้องการของคุณคุณยังคงสามารถใช้ตรรกะที่แตกต่างกันได้ขึ้นอยู่กับ HttpMethod โดยการดำเนินการบนค่า HttpContext.Request.HttpMethod


5
ใช้ได้ดีจนกว่าคุณจะลองใช้โมเดลดู! ในการดำเนินการโพสต์คุณมักจะส่งผ่านใน viewmodel ฉันได้ลองใช้พารามิเตอร์ที่เป็นทางเลือกและเริ่มต้นเป็น null แต่ไม่ได้ผล
JBeckton

1
@JBeckton โดยปกติฉันมีเมธอด GET ที่มีเพียงพารามิเตอร์สตริงแบบสอบถามSignIn(Guid? UserId)และ POST มีโมเดลมุมมองSignIn(SomeVM vm)และทั้งสองเรียกวิธีส่วนตัวที่ใช้ร่วมกันSignInHandleGetPost(...)... ซึ่งอาจใช้ VM ที่เมธอด GET ต้องเริ่มต้นหรือพารามิเตอร์เสริมหรืออะไรก็ตามที่คุณต้องการทำ สำหรับการ refactoring รหัส ruseable / shared
AaronLS

2
@JBeckton ฉันเพิ่งลองใช้ตอนนี้ด้วยโครงการตัวอย่าง ASP.NET MVC 4.6.1 ด้วยวิธีการAccountController.Login(String returnUrl, LoginViewModel model)และใช้งานได้ดี modelเป็นค่าว่างบน GET และไม่ใช่ค่าว่างบน POST อย่างไรก็ตาม[ValidateForgeryToken]จำเป็นต้องถูกลบล้างเนื่องจากValidateForgeryTokenมีข้อยกเว้นในคำขอ GET
Dai

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

นั่นไม่ใช่สิ่งที่ฉันกำลังมองหานั่นคือการใช้ MVC เริ่มต้นของการมีเมธอดแยกต่างหากสำหรับ GET และ POST ผ่านการโอเวอร์โหลดฟังก์ชัน ฉันไม่ใช่คนใหม่สำหรับ MVC ฉันกำลังพยายามให้การดำเนินการ GET ตอบสนองต่อเหตุการณ์ POST บางอย่างนอกเหนือจากการดำเนินการ POST มาตรฐานสำหรับคอลเล็กชันแบบฟอร์ม
Cranialsurge

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