Проверка данных в Entity Framework
Я использую Entity Framework с веб-страницами ASP.NET (Razor 3). У меня есть готовый код проверки, я использую собственный процесс проверки Entity Frameworks. Но есть проблема, например, в моей модели и базе данных есть десятичное поле с именем Amount. Я использую что-то вроде этого:
Item.Amount = decimal.Parse(Request.Form["ItemAmount"]);
Вот проблема, если ввод не числовой, я получаю ошибку (очевидно). Я могу легко это исправить, проверив, является ли ввод числовым, но если я сделаю это, то слишком много проверок таким образом. Я имею в виду, я проверяю, является ли он сначала числовым в коде, затем Entity Framework снова проверяет значение, поэтому я использую два разных процесса проверки, мне это кажется плохим.
Конечно, есть и клиентская сторона, может быть, я могу использовать только текстовые поля, но я не уверен.
Есть идеи?
Вот полный код, это, вероятно, ужасно, я довольно новичок в Entity Framework (например, 3-4 дня):
if (IsPost)
{
try
{
Worker curWorker = new Worker();
try
{
curWorker = m.Workers.Find(decimal.Parse(Request.Form["WorkerId"]));
}
catch (Exception)
{
errors += "Lütfen bir personel seçin. <br />";
}
overhour.Worker = curWorker;
overhour.PhaseId = curPhase.PhaseId;
try
{
overhour.OverhourAmount = decimal.Parse(Request.Form["OverhourAmount"]);
}
catch (Exception)
{
errors += "Süre (Saat) alanı sayısal olmalıdır. <br />";
}
overhour.OverhourDate = DateTime.Today;
curWorker.Overhours.Add(overhour);
Accounting accounting = new Accounting();
accounting.AccountingMethod = 0;
accounting.AccountingNote = curWorker.WorkerFullName + " adlı personelin, " + overhour.OverhourAmount + " saat süreli, " + DateTime.Today.ToShortDateString() + " tarihli mesai kaydı.";
accounting.AccountingType = 3; // Maaş
accounting.AccountingBorc = 0;
accounting.AccountingAlacak = curWorker.WorkerOverWorkSalary * overhour.OverhourAmount;
accounting.Phases = curPhase;
curWorker.Accountings.Add(accounting);
if (errors != "")
{
throw new WrongValueException(errors);
}
m.SaveChanges();
Response.Redirect(Page.ParentPage);
}
catch (DbEntityValidationException ex)
{
errors = kStatic.getValidationErrors(ex.EntityValidationErrors, "<br />");
}
catch (WrongValueException ex)
{
errors = ex.Message.ToString();
}
catch (Exception ex)
{
errors = "Bilinmeyen hata, teknik detaylar: " + ex.Message;
}
}
1 ответ
Я бы сделал метод расширения, например, эти два.
public static decimal AsDecimal(this string value)
{
decimal result;
return decimal.TryParse(value, out result) ? result : 0;
}
public static decimal? AsNullableDecimal(this string value)
{
decimal result;
bool IsValid = decimal.TryParse(value, out result);
if (IsValid)
{
return result;
}
else
{
return null;
}
}
Затем просто проверьте значение десятичного числа, как это.
decimal? value = Request.Form["WorkerId"].ToString().AsDecimal()
if (value.HasValue) //AsDecimal is overloaded you can make it return 0 if you wish
//dome something
else
//do something.
Я думаю, что это должно указать вам правильное направление. Кроме того, проверка КЛИЕНТА плохая, пользователи всегда могут изменить это с помощью таких инструментов, как инструменты разработчика. Не полагайтесь на проверку клиента.