Первоначально я построил свой сайт в 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 пользователя, и я уже объяснил им, что нужно вводить только число.Я хочу, чтобы это работало должным образом, но на данный момент и в связи с этой незначительной проблемой я не могу тратить много времени, переделывая его для использования другого метода проверки.