Проверка корректности в ASP.NET MVC - PullRequest
2 голосов
/ 01 апреля 2010

Я заблудился в этом проекте 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>

<% } %>

Обратите внимание, что единственное редактируемое поле - это LastName.Когда я выполняю обратную передачу, я возвращаю первоначального сотрудника и пытаюсь обновить его с помощью only свойства LastName.Но я вижу на странице следующую ошибку:

• Поле FirstName обязательно для заполнения.

Это, как я понимаю, из-за сбоя TryUpdateModel.Но почему?Я сказал ему обновить только свойство LastName.

Я использую MVC2 RTM

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2010

Проблема в том, что когда ваша форма отправляется обратно, поле FirstName остается пустым. Проблема заключается в том, что, поскольку вы передаете сотрудника в качестве параметра своему действию, проверка происходит до того, как вы получите возможность позвонить на GetEmployee(). Вы можете сделать одну из трех вещей:

1) Удалите атрибут [Required] из поля FirstName.

или

2) Добавьте Html.HiddenFor() для этого поля, чтобы оно совершало круговую поездку. Как это:

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

или

3) Измените объявление действия на:

public ActionResult Edit(int id, FormCollection form)

(3), вероятно, то, что вы ищете.

0 голосов
/ 09 апреля 2010

Не забудьте быть осторожным с привязкой модели.Это отличный пост, который объясняет, почему: http://www.codethinked.com/post/2009/01/08/ASPNET-MVC-Think-Before-You-Bind.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...