Почему механизм связывания модели по умолчанию не проверяет поля, если они не находятся в данных формы? - PullRequest
2 голосов
/ 24 апреля 2009

Допустим, у вас есть простой объект, подобный этому:

public class MyObject {
    public int Test { get; set; }
}

И вы рассчитываете на связыватель модели по умолчанию, чтобы убедиться, что пользователь не оставляет поле «Тест» пустым при публикации формы, как показано ниже:

<form method="post" action="/test">
    <p>
        <%=Html.TextBox("Test") %>
        <%=Html.ValidationMessage("Test") %>
    </p>
    <input id="Submit1" type="submit" value="submit" />
 </form>

И это действие:

[AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Test(MyObject o) {
     return View();
 }

Это все работает должным образом, когда данные формы содержат ключ для «Test» (например, «Test=val» или «Test=»)

Но если ключ отсутствует в данных формы, проверка не происходит. Таким образом, в случае пустого почтового запроса или запроса с данными, такими как AnotherField=foo, свойство объекта модели по умолчанию соответствует значению типа по умолчанию (в данном случае 0). И ModelState.IsValid возвращает истину.

Это, IMO, не то поведение, которое можно было бы ожидать.
Так что вы предлагаете изменить это поведение?

Редактировать: Имейте в виду, что злонамеренный пользователь может легко подделать данные формы с помощью плагина FireBug или Tamper Data , чтобы передать проверки связывателя модели по умолчанию, что может вызвать некоторые проблемы безопасности.

Ответы [ 4 ]

2 голосов
/ 20 января 2010

К сожалению, проверка полей не предусмотрена. Пожалуйста, ознакомьтесь с этой проблемой Codeplex , которую я нашел и прокомментировал.

Очень жаль, что MS решила, что это правильное поведение для их связующей модели.

Я считаю, что механизм связывания модели по умолчанию должен проверять всю сущность , а не только опубликованные данные.

1 голос
/ 24 апреля 2009

Вы можете рассмотреть возможность использования xVal для выполнения необходимого сочетания проверки на стороне клиента и сервера. С его помощью вы можете добавить к свойству Test атрибут, определяющий, какие правила проверки (обязательные, проверка регулярных выражений и т. Д.) Применяются к нему, а затем, немного потрудившись, заставить его сгенерировать для вас правила JavaScript, а также довольно легко выполнить проверку модели.

Вы уже знаете, что нарушаете правило разработки - никогда не доверяйте вводу клиента. Там действительно нет пути.

Проверка на стороне клиента (не позволяющая выяснить, есть ли ошибка), это хорошо, так как проверка на стороне сервера, подтверждающая, что все в порядке, является обязательной.

0 голосов
/ 30 августа 2009

Изучив все различные способы получения значений формы в моих методах контроллера, я обнаружил, что «самым безопасным» было явное определение каждого поля формы в качестве параметра для контроллера. Побочным эффектом является то, что если форма НЕ имеет одного из полей, она выдаст исключение - что решит вашу проблему.

0 голосов
/ 30 августа 2009

Я надеюсь, что это так, потому что я собираюсь начать полагаться на это поведение!

в одном случае у меня есть два элемента управления, которые публикуют следующие поля:

ShippingAddress.FirstName
ShippingAddress.LastName
ShippingAddress.Line1
ShippingAddress.Line2

BillingAddress.Email
BillingAddress.FirstName
BillingAddress.LastName
BillingAddress.Line1
BillingAddress.Line2

Примечание. В адресе выставления счета не отображается электронная почта, хотя базовая модель, конечно, все еще имеет ее

Если в моей модели аннотации к данным [Обязательный] в моей модели есть электронная почта, она будет выдавать жалобы только в том случае, если она отсутствует в платежном адресе.

Но я определенно понимаю вашу точку зрения! Я просто полагаюсь на это для этого одного сценария здесь!

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