2015-08-30 90 views
0

我在使用ASP.NET Web页面的实体框架(Razor 3)。我准备好了验证代码,我使用Entity Frameworks自己的验证过程。但是有一个问题,例如在我的模型和数据库中有一个名为的小数字段。我用的是这样的:实体框架中的数据验证

Item.Amount = decimal.Parse(Request.Form["ItemAmount"]); 

这里的问题是,如果输入的非数字,我得到一个错误(显然)。我可以很容易地通过检查输入是否是数字来修复它,但如果我这样做,那么验证检查的方式就太多了。我的意思是,我检查它是否是代码中的数字,然后Entity Framework再次检查值,所以我使用了两个不同的验证过程,这对我来说似乎不好。

Ofcourse还有一个客户端,也许我可以使用数字只有文本框,但我不知道。

任何想法?

下面是完整的代码,它可能是太可怕了,我是相当新的实体框架(如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; 
    } 
} 
+0

改为使用模型绑定 - 当您可以让Post事件接受复杂的数据类型并让MVC执行绑定和验证时,为什么要查询'Request.Form'。然后,你可以检查'Model.IsValid' –

+0

@BrendanGreen我没有实际使用MVC,我试过了,最糟糕的问题是绑定了我,我不知道为什么。 – user5273382

+0

请显示整个发布操作。 –

回答

0

我会做的是使一个扩展方法,例如像这两个。

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. 

我认为这应该指向正确的方向。同样在该笔记上,CLIENT验证是不好的,用户总是可以使用开发工具等工具来改变它。不要依赖客户端验证。