มีสามวิธีที่คุณสามารถแก้ไขปัญหาข้างต้นได้
- วิธี HTML
- วิธีการ jquery
- “ ActionNameSelectorAttribute” วิธี
ด้านล่างเป็นวิดีโอที่สรุปทั้งสามวิธีด้วยวิธีสาธิต
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
วิธี HTML: -
ในวิธี HTML เราจำเป็นต้องสร้างสองรูปแบบและวางปุ่ม "ส่ง" ภายในแต่ละรูปแบบ และการกระทำของทุกรูปแบบจะชี้ไปที่การกระทำที่แตกต่างกัน / ตามลำดับ คุณสามารถดูรหัสด้านล่างเมื่อมีการโพสต์แบบฟอร์มแรกไปที่“ Action1” และแบบฟอร์มที่สองจะโพสต์ที่“ Action2” โดยขึ้นอยู่กับการคลิกปุ่ม“ ส่ง”
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
วิธี Ajax: -
ในกรณีที่คุณเป็นคนรักอาแจ็กซ์ตัวเลือกที่สองนี้จะทำให้คุณตื่นเต้นมากขึ้น ในวิธี Ajax เราสามารถสร้างฟังก์ชั่นที่แตกต่างกันสองฟังก์ชั่น“ Fun1” และ“ Fun1” ดูรหัสด้านล่าง ฟังก์ชั่นเหล่านี้จะทำการโทร Ajax โดยใช้ JQUERY หรือกรอบงานอื่น ๆ แต่ละฟังก์ชั่นเหล่านี้ถูกผูกไว้กับเหตุการณ์“ OnClick” ของปุ่ม“ ส่ง” แต่ละฟังก์ชันเหล่านี้โทรไปยังชื่อการกระทำที่เกี่ยวข้อง
<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>
<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>
ใช้“ ActionNameSelectorAttribute”: -
นี่เป็นตัวเลือกที่ยอดเยี่ยมและสะอาดตา “ ActionNameSelectorAttribute” เป็นคลาสแอตทริบิวต์แบบง่าย ๆ ที่เราสามารถเขียนตรรกะการตัดสินใจซึ่งจะตัดสินว่าการกระทำใดที่สามารถดำเนินการได้
ดังนั้นสิ่งแรกคือใน HTML เราจำเป็นต้องใส่ชื่อที่ถูกต้องของปุ่มส่งเพื่อระบุพวกเขาบนเซิร์ฟเวอร์
คุณสามารถเห็นเราได้ใส่ "บันทึก" และ "ลบ" ไปที่ชื่อปุ่ม นอกจากนี้คุณสามารถสังเกตเห็นในการดำเนินการที่เราเพิ่งใส่ชื่อผู้ควบคุม“ ลูกค้า” และไม่ใช่ชื่อการกระทำที่เฉพาะเจาะจง เราคาดว่าชื่อการกระทำจะได้รับการตัดสินโดย“ ActionNameSelectorAttribute”
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
ดังนั้นเมื่อมีการคลิกปุ่มส่งอันดับแรกจะเข้าสู่แอตทริบิวต์“ ActionNameSelector” ก่อนแล้วจึงส่งไปที่การดำเนินการที่เหมาะสม
ดังนั้นขั้นตอนแรกคือการสร้างคลาสที่สืบทอดมาจากคลาส“ ActionNameSelectorAttribute” ในคลาสนี้เราได้สร้างคุณสมบัติ "ชื่อ" แบบง่าย
นอกจากนี้เรายังต้องแทนที่ฟังก์ชั่น“ IsValidName” ซึ่งจะคืนค่าจริงหรือ flase ฟังก์ชั่นนี้เป็นที่ที่เราเขียนลอจิกว่าจะต้องมีการดำเนินการหรือไม่ ดังนั้นหากฟังก์ชันนี้คืนค่าเป็นจริงการดำเนินการจะถูกดำเนินการหรือไม่เช่นนั้น
public class SubmitButtonSelector : ActionNameSelectorAttribute
{
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
{
// Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
}
}
หัวใจหลักของฟังก์ชั่นด้านบนอยู่ในรหัสด้านล่าง คอลเล็กชัน“ ValueProvider” มีข้อมูลทั้งหมดที่โพสต์จากแบบฟอร์ม ดังนั้นก่อนค้นหาค่า“ ชื่อ” และหากพบในคำขอ HTTP จะส่งคืนจริงหรือมิฉะนั้นจะส่งกลับเท็จ
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
คลาสของแอ็ตทริบิวต์นี้สามารถตกแต่งในการดำเนินการที่เกี่ยวข้องและสามารถจัดเตรียมค่า "ชื่อ" ที่เกี่ยวข้อง ดังนั้นหากการส่งกำลังกดปุ่มการกระทำนี้และหากชื่อตรงกับชื่อปุ่มส่ง HTML ก็จะดำเนินการกระทำต่อไปมิฉะนั้นจะไม่ทำงาน
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}