ฉันมีสองปุ่มในแบบฟอร์ม MVC ของฉัน:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
จากการกระทำของคอนโทรลเลอร์ฉันจะรู้ได้อย่างไรว่าอันไหนถูกกด?
ฉันมีสองปุ่มในแบบฟอร์ม MVC ของฉัน:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
จากการกระทำของคอนโทรลเลอร์ฉันจะรู้ได้อย่างไรว่าอันไหนถูกกด?
คำตอบ:
ตั้งชื่อปุ่มส่งทั้งสองปุ่มเหมือนกัน
<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />
จากนั้นในคอนโทรลเลอร์ของคุณจะได้รับค่า submit เฉพาะปุ่มที่คลิกเท่านั้นที่จะส่งผ่านค่าของมัน
public ActionResult Index(string submit)
{
Response.Write(submit);
return View();
}
แน่นอนคุณสามารถประเมินค่านั้นเพื่อดำเนินการต่างๆด้วยสวิตช์บล็อก
public ActionResult Index(string submit)
{
switch (submit)
{
case "Save":
// Do something
break;
case "Process":
// Do something
break;
default:
throw new Exception();
break;
}
return View();
}
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
เพื่อจุดประสงค์ i18n ไม่ได้หรือไม่ดังนั้นสตริงที่ผู้ใช้เผชิญหน้าจึงสามารถปรับแต่งได้และชื่อองค์ประกอบแบบฟอร์มจะไม่ถูกเปิดเผยโดยตรงกับผู้ใช้ (ซึ่งเป็นเลขแปลกและในตัวมันเอง)
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
และในการดำเนินการควบคุมของคุณ:
public ActionResult SomeAction(string submit)
{
if (!string.IsNullOrEmpty(submit))
{
// Save was pressed
}
else
{
// Process was pressed
}
}
นี่เป็นคำตอบที่ดีกว่าดังนั้นเราสามารถมีทั้งข้อความและค่าสำหรับปุ่ม:
</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>
และตัวควบคุม:
public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
return RedirectToAction("Index", "Home");
...
เรียกสั้น ๆ ว่าปุ่ม SUBMIT แต่คุณเลือกชื่อโดยใช้แอตทริบิวต์ name ซึ่งมีประสิทธิภาพมากยิ่งขึ้นเนื่องจากคุณไม่ได้ผูกพันกับชื่อส่งหรือปุ่มในพารามิเตอร์วิธีการควบคุมคุณสามารถเรียกได้ตามที่คุณต้องการ ...
คุณสามารถระบุปุ่มของคุณได้จากป้ายชื่อด้านล่างคุณต้องตรวจสอบเช่นนี้ในตัวควบคุมของคุณ
if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
นี่เป็นวิธีที่ดีและง่ายมากในการทำตามคำแนะนำโดยใช้ MultiButtonAttribute ที่กำหนดเอง:
สรุปให้ทำปุ่มส่งของคุณดังนี้:
<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" />
การกระทำของคุณเช่นนี้:
[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
return Content("Cancel clicked");
}
[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
return Content("Create clicked");
}
และสร้างคลาสนี้:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public string MatchFormKey { get; set; }
public string MatchFormValue { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request[MatchFormKey] != null &&
controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
}
}
MultiButtonAttribute
แอตทริบิวต์ที่กำหนดเองเพื่อให้สามารถแยกความแตกต่างระหว่างปุ่มส่ง จริงๆแล้วเป็นความคิดที่ดีทีเดียว
Arnis L.
ปฏิบัติตามคำแนะนำเดียวกันคุณอาจสังเกตเห็นว่าเขาให้ลิงค์เดียวกันเมื่อ 4 ปีก่อน:>
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
string submitType = "unknown";
if(collection["submit"] != null)
{
submitType = "submit";
}
else if (collection["process"] != null)
{
submitType = "process";
}
} // End of the index method
เพื่อให้ง่ายขึ้นฉันจะบอกว่าคุณสามารถเปลี่ยนปุ่มของคุณดังต่อไปนี้:
<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />
ตัวควบคุมของคุณ:
public ActionResult Create(string btnSubmit, string btnProcess)
{
if(btnSubmit != null)
// do something for the Button btnSubmit
else
// do something for the Button btnProcess
}
โพสต์นี้จะไม่ตอบสำหรับ Coppermill เพราะเขาได้รับคำตอบเมื่อนานมาแล้ว โพสต์ของฉันจะเป็นประโยชน์สำหรับผู้ที่ต้องการหาวิธีแก้ปัญหาเช่นนี้ ก่อนอื่นฉันต้องบอกว่า "โซลูชันของ WDuffy ถูกต้องทั้งหมด" และใช้งานได้ดี แต่โซลูชันของฉัน (ไม่ใช่ของฉันจริง) จะถูกใช้ในองค์ประกอบอื่น ๆ และทำให้เลเยอร์การนำเสนอเป็นอิสระจากคอนโทรลเลอร์มากขึ้น (เนื่องจากคอนโทรลเลอร์ของคุณขึ้นอยู่กับ "value" ซึ่งใช้สำหรับแสดงป้ายกำกับของปุ่มคุณลักษณะนี้มีความสำคัญสำหรับภาษาอื่น ๆ )
นี่คือทางออกของฉันตั้งชื่อให้ต่างกัน:
<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>
และคุณต้องระบุชื่อของปุ่มเป็นอาร์กิวเมนต์ในการดำเนินการดังต่อไปนี้:
public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
if (buttonSave!= null)
{
//save is pressed
}
if (buttonProcess!= null)
{
//Process is pressed
}
if (buttonCancel!= null)
{
//Cancel is pressed
}
}
เมื่อผู้ใช้ส่งเพจโดยใช้ปุ่มใดปุ่มหนึ่งอาร์กิวเมนต์เดียวเท่านั้นที่จะมีค่า ฉันเดาว่านี่จะเป็นประโยชน์สำหรับคนอื่น ๆ
ปรับปรุง
คำตอบนี้ค่อนข้างเก่าและฉันก็พิจารณาความคิดเห็นของฉันใหม่ วิธีแก้ปัญหาข้างต้นอาจดีสำหรับสถานการณ์ที่ส่งผ่านพารามิเตอร์ไปยังคุณสมบัติของโมเดล อย่ากังวลตัวเองและหาทางออกที่ดีที่สุดสำหรับโครงการของคุณ
input[type=submit]
ค่าที่ถูกเรียกกลับเท่านั้นดังนั้นโมเดลทั้งหมดจึงสามารถเชื่อมโยงกับคุณสมบัติที่มีคุณสมบัติเดียวกันname
(เช่นaction
) จากนั้นคุณสามารถแยกความแตกต่างของปุ่มตามvalue
สตริงนั้นโดยไม่จำเป็นต้องแนะนำตัวแปรจำนวนมากในลายเซ็นของคุณ . โปรดใช้เวลาในการพิจารณาเกี่ยวกับการจัดรูปแบบ / การเยื้องก่อนโพสต์
คุณไม่สามารถค้นหาโดยใช้ Request.Form Collection ได้หรือไม่? ถ้ากระบวนการถูกคลิก request.form ["process"] จะไม่ว่างเปล่า
ตั้งชื่อให้กับทั้งสองปุ่มและรับค่าจากแบบฟอร์ม
<div>
<input name="submitButton" type="submit" value="Register" />
</div>
<div>
<input name="cancelButton" type="submit" value="Cancel" />
</div>
ด้านคอนโทรลเลอร์:
public ActionResult Save(FormCollection form)
{
if (this.httpContext.Request.Form["cancelButton"] !=null)
{
// return to the action;
}
else if(this.httpContext.Request.Form["submitButton"] !=null)
{
// save the oprtation and retrun to the action;
}
}
ในหน้า Core 2.2 Razor ไวยากรณ์นี้ใช้งานได้:
<button type="submit" name="Submit">Save</button>
<button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
return Page();
var sub = Request.Form["Submit"];
var can = Request.Form["Cancel"];
if (sub.Count > 0)
{
.......
string submit
เทียบกับการเขียนstring submit = Request.Form["Submit"];
มากกว่า ประโยชน์ที่ใหญ่ที่สุดอย่างหนึ่งของ Razor Pages และ / หรือ MVC คือความสามารถในการอ่านวิธีการไม่เช่นนั้นอาจเป็น PHP
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
?