Проверка MVC Asp.net для не-строк - PullRequest
2 голосов
/ 02 июля 2010

Первоначально я построил свой сайт в MVC 1.0, используя учебное пособие по NerdDinner в качестве основы.Многие из ранних дизайнерских решений были приняты просто потому, что «именно так NerdDinner сделал это». С тех пор он действительно вырос и был преобразован в 2.0.

Моя проверка по-прежнему работает так, как это делал NerdDinner, и оченьминимальный, поэтому, хотя я читал о других способах, никогда не было причин его менять.

Недавно я добавил несколько новых полей типа decimal.После освобождения пользователь попытался ввести значения «3000» и «3000» и получил основную ошибку «недействительно».Я объяснил ему, что он может вводить только цифры в поле.Я вошел в мою проверку и добавил лучшую проверку для этого поля, чтобы в будущем они могли получить более описательное сообщение.Однако значение поля передается в мою процедуру проверки как нулевое.Если введен действительный десятичный знак, он передается в процедуру проверки.У меня уже была проверка для моих полей дат, и я понял, что с ними происходит то же самое.Все мои другие проверки являются строками, и проверка проверяет такие вещи, как символы, которые я не разрешаю, и это прекрасно работает.Но в этих случаях это на самом деле не проверка того, что БД считает недействительным.

Это пример моей проверки:

  public IEnumerable<RuleViolation> GetRuleViolations()
    {

        if (String.IsNullOrEmpty(subcontract_no.Trim()))
            yield return new RuleViolation("Subcontract Number is required", "subcontract_no");

        if (db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) && (s.subcontract_id != subcontract_id)) > 0)
            yield return new RuleViolation("Subcontract Number already exists", "subcontract_no");

        if (subcontract_no.Contains("/")) // quick fix, needs better validation
            yield return new RuleViolation("Subcontract Number cannot contain /", "subcontract_no");

       if (!isValidDate(expiration_date.ToString()))
            yield return new RuleViolation("Expiration Date is not valid", "expiration_date");

        if (!isValidDecimal(insurance_GLminreq.ToString()))
            yield return new RuleViolation("Insurance GL Level must be a number", "insurance_GLminreq");

"isValidDate" и "isValidDecimal«подпрограммы работают, как я и ожидал, проблема в том, что если значение для insurance_GLminreq не является десятичным, оно передается как ноль, а не« 3000 долларов »или как-то еще.Вместо того, чтобы пользователь увидел сообщение «Уровень GL страхования должен быть числом», он увидит «Значение« $ 3000 »недопустимо для insurance_GLminreq».Мне бы хотелось, чтобы сообщение было более наглядным, чтобы они знали, почему оно не является действительным, и я бы предпочел, чтобы они не видели действительное имя поля, а то, что соответствовало метке для поля.

Есть ли относительно быстрый способ исправить это, не требующий переписывания методов проверки?В этом разделе сайта всего 3 пользователя, и я уже объяснил им, что нужно вводить только число.Я хочу, чтобы это работало должным образом, но на данный момент и в связи с этой незначительной проблемой я не могу тратить много времени, переделывая его для использования другого метода проверки.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2010

Быстро обошлось, используя плагин проверки jquery.http://bassistance.de/jquery-plugins/jquery-plugin-validation/

0 голосов
/ 02 июля 2010

Один из способов исправить это - изменить модель MVC: сделать строки expiration_date и insurance_GLminreq.

Если вы еще этого не сделали, вам необходимо ввести модель представления, которая может быть преобразована в модель вашего домена и обратно, поскольку вы хотите, чтобы эти значения были на DateTime и decimal дальше линия. (См. Стив Микелотти * ASP.NET MVC Просмотр образцов моделей для отличного обсуждения ваших вариантов.)

...