Проверка данных в 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.

Я думаю, что это должно указать вам правильное направление. Кроме того, проверка КЛИЕНТА плохая, пользователи всегда могут изменить это с помощью таких инструментов, как инструменты разработчика. Не полагайтесь на проверку клиента.

Другие вопросы по тегам