ฉันต้องการให้การดำเนินการเดียวตอบสนองทั้ง Gets และ Posts ฉันลองทำดังต่อไปนี้
[HttpGet]
[HttpPost]
public ActionResult SignIn()
ดูเหมือนจะไม่ได้ผล ข้อเสนอแนะใด ๆ ?
ฉันต้องการให้การดำเนินการเดียวตอบสนองทั้ง Gets และ Posts ฉันลองทำดังต่อไปนี้
[HttpGet]
[HttpPost]
public ActionResult SignIn()
ดูเหมือนจะไม่ได้ผล ข้อเสนอแนะใด ๆ ?
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
หรือ[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
? ฉันไม่รู้อะไรเลยเกี่ยวกับคุณสมบัติเหล่านั้น แต่ถ้าคุณทำอย่างที่สองนั่นอาจเป็นสาเหตุที่ทำให้คุณได้รับข้อผิดพลาดนั้น
คำตอบ:
การดำเนินการตอบสนองต่อทั้ง GET และ POST โดยค่าเริ่มต้นคุณจึงไม่ต้องระบุอะไรเลย:
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
ขึ้นอยู่กับความต้องการของคุณคุณยังคงสามารถใช้ตรรกะที่แตกต่างกันได้ขึ้นอยู่กับ HttpMethod โดยการดำเนินการบนค่า HttpContext.Request.HttpMethod
SignIn(Guid? UserId)
และ POST มีโมเดลมุมมองSignIn(SomeVM vm)
และทั้งสองเรียกวิธีส่วนตัวที่ใช้ร่วมกันSignInHandleGetPost(...)
... ซึ่งอาจใช้ VM ที่เมธอด GET ต้องเริ่มต้นหรือพารามิเตอร์เสริมหรืออะไรก็ตามที่คุณต้องการทำ สำหรับการ refactoring รหัส ruseable / shared
AccountController.Login(String returnUrl, LoginViewModel model)
และใช้งานได้ดี model
เป็นค่าว่างบน GET และไม่ใช่ค่าว่างบน POST อย่างไรก็ตาม[ValidateForgeryToken]
จำเป็นต้องถูกลบล้างเนื่องจากValidateForgeryToken
มีข้อยกเว้นในคำขอ GET
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}