คำตอบนั้นดีมาก แต่มีอีกวิธีหนึ่งใน MVC และ. NET รุ่นล่าสุดที่ฉันชอบใช้แทนที่จะใช้ FormCollection และ Request keys "โรงเรียนเก่า"
พิจารณาข้อมูลโค้ด HTML ที่อยู่ในแท็กฟอร์มที่ทำ AJAX หรือ FORM POST
<input type="hidden" name="TrackingID"
<input type="text" name="FirstName" id="firstnametext" />
<input type="checkbox" name="IsLegal" value="Do you accept terms and conditions?" />
ตัวควบคุมของคุณจะแยกวิเคราะห์ข้อมูลแบบฟอร์มและพยายามส่งให้คุณเป็นพารามิเตอร์ของประเภทที่กำหนด ฉันรวมช่องทำเครื่องหมายเพราะเป็นช่องที่ยุ่งยาก จะส่งคืนข้อความ "on" หากทำเครื่องหมายและเป็นโมฆะหากไม่ได้ตรวจสอบ ข้อกำหนดแม้ว่าตัวแปรที่กำหนดเหล่านี้จะต้องมีอยู่ (เว้นแต่เป็นโมฆะ (โปรดจำไว้ว่าstring
เป็นโมฆะ)) มิฉะนั้น AJAX หรือ POST back จะล้มเหลว
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
นอกจากนี้คุณยังสามารถโพสต์แบบจำลองได้โดยไม่ต้องใช้ตัวช่วยมีดโกน ฉันพบว่าสิ่งนี้จำเป็นบางครั้ง
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
มาร์กอัป HTML จะเป็น ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
และคอนโทรลเลอร์ของคุณ (Razor Engine) จะดักจับ "variableName" ของ Form Variable (ชื่อเป็นไปตามที่คุณต้องการ แต่ทำให้สอดคล้องกัน) และพยายามสร้างขึ้นและส่งไปยัง MyModel
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
เมื่อคอนโทรลเลอร์คาดหวัง Model (ในกรณีนี้คือ HomeModel) คุณไม่จำเป็นต้องกำหนดฟิลด์ทั้งหมดเนื่องจากตัวแยกวิเคราะห์จะปล่อยให้เป็นค่าเริ่มต้นโดยปกติจะเป็น NULL สิ่งที่ดีคือคุณสามารถผสมและจับคู่โมเดลต่างๆบน Mark-up และการแยกโพสต์กลับจะถูกเติมให้มากที่สุด คุณไม่จำเป็นต้องกำหนดโมเดลบนเพจหรือใช้ตัวช่วยใด ๆ
เคล็ดลับ: ชื่อของพารามิเตอร์ในคอนโทรลเลอร์คือชื่อที่กำหนดในมาร์กอัป HTML "name =" ไม่ใช่ชื่อของ Model แต่เป็นชื่อของตัวแปรที่คาดหวังใน!
การใช้List<>
มีความซับซ้อนกว่าเล็กน้อยในการมาร์กอัป
<input type="text" name="variableNameHere[0].HouseNumber" id="id" value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber" value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">
ดัชนีในรายการ <> ต้องเป็นศูนย์และตามลำดับเสมอ 0,1,2,3
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
ใช้IEnumerable<>
สำหรับดัชนีที่ไม่อิงตามศูนย์และไม่ใช่ตามลำดับจะโพสต์กลับ เราจำเป็นต้องเพิ่มอินพุตพิเศษที่ซ่อนอยู่เพื่อช่วยในการประสาน
<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id" value="3">
<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3" value="4">
<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23" value="5">
และรหัสก็ต้องใช้ IEnumerable และโทร ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
ขอแนะนำให้ใช้ Model เดียวหรือ ViewModel (Model contianing other models to create a complex 'View' Model) ต่อหน้า การผสมและจับคู่ตามที่เสนออาจถือเป็นการปฏิบัติที่ไม่ดี แต่ตราบใดที่มันใช้งานได้และอ่านได้มันก็ไม่ใช่ BAD อย่างไรก็ตามมันแสดงให้เห็นถึงพลังและความยืดหยุ่นของเครื่องยนต์ Razor
ดังนั้นหากคุณจำเป็นต้องทิ้งบางสิ่งบางอย่างโดยพลการหรือแทนที่ค่าอื่นจากตัวช่วย Razor หรือเพียงแค่ไม่รู้สึกอยากสร้างตัวช่วยของคุณเองสำหรับรูปแบบเดียวที่ใช้ข้อมูลที่ผิดปกติคุณสามารถใช้วิธีการเหล่านี้เพื่อยอมรับส่วนเกินได้อย่างรวดเร็ว ข้อมูล.