การตรวจสอบความถูกต้องใน ASP.NET MVC

ฉันหลงทางในโครงการ MVC ที่ฉันกำลังทำอยู่ ฉันยังอ่านบทความของแบรดวิลสันด้วย http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

ฉันมีสิ่งนี้:

public class Employee
{
    [Required]
    public int ID { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}

และสิ่งเหล่านี้อยู่ในคอนโทรลเลอร์:

public ActionResult Edit(int id)
{
    var emp = GetEmployee();
    return View(emp);
}

[HttpPost]
public ActionResult Edit(int id, Employee empBack)
{
    var emp = GetEmployee();
    if (TryUpdateModel(emp,new string[] { "LastName"})) {
        Response.Write("success");
    }
    return View(emp);
}

public Employee GetEmployee()
{
    return new Employee {
       FirstName = "Tom",
       LastName = "Jim",
       ID = 3
    };
}

และความเห็นของฉันมีดังต่อไปนี้:

<% using (Html.BeginForm()) {%>
    <%= Html.ValidationSummary() %>

    <fieldset>
        <legend>Fields</legend>    
        <div class="editor-label">
            <%= Html.LabelFor(model => model.FirstName) %>
        </div>
        <div class="editor-field">
            <%= Html.DisplayFor(model => model.FirstName) %>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.LastName) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxOrLabelFor(model => model.LastName, true)%>
            <%= Html.ValidationMessageFor(model => model.LastName) %>
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

โปรดทราบว่าฟิลด์เดียวที่สามารถแก้ไขได้คือนามสกุล เมื่อฉัน postback ฉันจะกลับไปหาพนักงานคนเดิมและพยายามอัปเดตด้วยคุณสมบัติ LastName เท่านั้น แต่ฉันเห็นในหน้านี้มีข้อผิดพลาดต่อไปนี้:

•จำเป็นต้องกรอกฟิลด์ชื่อ

จากสิ่งที่ฉันเข้าใจเป็นเพราะ TryUpdateModel ล้มเหลว แต่ทำไม? ฉันบอกให้อัปเดตเฉพาะคุณสมบัติ LastName

ฉันกำลังใช้ MVC2 RTM

ขอบคุณล่วงหน้า.


person rkrauter    schedule 31.03.2010    source แหล่งที่มา


คำตอบ (2)


ปัญหาคือเมื่อแบบฟอร์มของคุณถูกโพสต์กลับ ฟิลด์ FirstName จะว่างเปล่า ปัญหาก็คือ เนื่องจากคุณส่ง Employee เป็นพารามิเตอร์ให้กับการกระทำของคุณ การตรวจสอบความถูกต้องจึงเกิดขึ้นก่อนที่คุณจะมีโอกาสทำการเรียกไปที่ GetEmployee() คุณสามารถทำหนึ่งในสามสิ่งต่อไปนี้:

1) ลบแอตทริบิวต์ [Required] ออกจากฟิลด์ FirstName ของคุณ

or

2) เพิ่ม Html.HiddenFor() สำหรับช่องนี้เพื่อให้ไป-กลับ แบบนี้:

<%= Html.HiddenFor(model => model.FirstName) %>

or

3) เปลี่ยนคำประกาศการกระทำของคุณเป็น:

public ActionResult Edit(int id, FormCollection form)

(3) อาจเป็นสิ่งที่คุณกำลังมองหา

person Keltex    schedule 31.03.2010

อย่าลืมระมัดระวังในการผูกโมเดล นี่เป็นโพสต์ที่ดีที่อธิบายว่าทำไม: http://www.codethinked.com/post/2009/01/08/ASPNET-MVC-Think-Before-You-Bind.aspx

person Maksymilian Majer    schedule 09.04.2010