Validasi diaktifkan di ASP.NET MVC

Saya tersesat dalam proyek MVC yang sedang saya kerjakan. Saya juga membaca artikel Brad Wilson. http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

Aku punya ini:

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

dan ini di pengontrol:

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
    };
}

dan pandangan saya adalah sebagai berikut:

<% 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>

<% } %>

Perhatikan bahwa satu-satunya bidang yang dapat diedit adalah Nama Belakang. Ketika saya melakukan postback, saya mendapatkan kembali karyawan asli dan mencoba memperbaruinya dengan hanya properti LastName. Tapi saya melihat di halaman itu ada kesalahan berikut:

•Bidang Nama Depan wajib diisi.

Dari apa yang saya pahami, ini karena TryUpdateModel gagal. Tapi kenapa? Saya menyuruhnya untuk memperbarui hanya properti LastName.

Saya menggunakan MVC2 RTM

Terima kasih sebelumnya.


person rkrauter    schedule 31.03.2010    source sumber


Jawaban (2)


Masalahnya adalah ketika formulir Anda diposting kembali, kolom FirstName kosong. Masalahnya adalah karena Anda meneruskan Karyawan sebagai parameter tindakan Anda, validasi terjadi sebelum Anda sempat melakukan panggilan ke GetEmployee(). Anda dapat melakukan salah satu dari tiga hal berikut:

1) Hapus atribut [Required] dari bidang FirstName Anda.

or

2) Tambahkan Html.HiddenFor() untuk bidang ini sehingga akan bolak-balik. Seperti ini:

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

or

3) Ubah deklarasi tindakan Anda menjadi:

public ActionResult Edit(int id, FormCollection form)

(3) mungkin adalah apa yang Anda cari.

person Keltex    schedule 31.03.2010

Ingatlah untuk berhati-hati dalam mengikat model. Ini adalah postingan bagus yang menjelaskan alasannya: http://www.codethinked.com/post/2009/01/08/ASPNET-MVC-Think-Before-You-Bind.aspx

person Maksymilian Majer    schedule 09.04.2010