实体框架

时间:2015-08-31 19:51:05

标签: c# asp.net entity-framework validation razor

我已经问了一个类似的问题,但我甚至看不出我写的代码,看起来很可怕。有些不对劲。

我正在尝试使用Visual Studio,ASP.Net Web Pages和Entity Framework创建一个简单的Web应用程序。人们不熟悉Web页面,它基本上是一个像经典ASP和PHP的开发环境。

我有两张桌子,一张是工人,另一张是下班。我为两者创建了模型,它们是相关的,所以每个过时的记录都有一个工人。

基本上我正在使用这段代码:

if (IsPost)
{
    try
    {
        Worker curWorker = new Worker();
        try
        {
            curWorker = m.Workers.Find(decimal.Parse(Request.Form["WorkerId"]));
        }
        catch (Exception)
        {
            errors += "Please select a worker.";
        }

        try
        {
            overhour.OverhourAmount = decimal.Parse(Request.Form["OverhourAmount"]);
            if (overhour.OverhourAmount == 0)
            {
                throw new Exception();
            }
        }
        catch (Exception)
        {
            errors += "Hour field should be numerical and non-zero.";
        }

        overhour.Worker = curWorker;
        overhour.OverhourDate = DateTime.Today;
        curWorker.Overhours.Add(overhour);

        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 = "Critical error, technical details: " + ex.Message;
    }
}

Form有一个名为 WorkerId 的所有工人的组合框。它有效,但我有一些问题。

  1. 我讨厌验证方法。我需要验证用户是否从组合框中选择了一个有效的工作者,因为它有一个名为“选择一个工人”的选项,它的值是空字符串,所以我需要检查它是否为数字。我可以在我的模型类中包含[Regex ..]代码,但这并不重要,因为当我尝试将字符串分配给十进制字段(十进制WorkerId)时会出现错误。我可以捕获异常但它可能是一个不匹配的异常。我需要更多细节。
  2. 与OverhourAmount相同,它应该是数字和非零。
  3. 我不喜欢将此代码放入页面代码本身。我可以用 r.addOverhour 等方法创建一个存储库类,但人们说这是不必要的。对于MVC是不必要的,或者如果您使用的是Entity Framework,则不应使用额外的存储库类。
  4. 我想在保存更改之前检查数据库以进行一些验证。例如,用户(具有用户名和密码的用户,而不是工作人员)如果不在同一建筑物中,则不应该创建关于工人的记录。例如,用户A在构建X中工作,而工作者H在构建Y时工作,用户A不应该能够创建与工作者H相关的任何数据。因此我需要在添加记录之前检查它们是否在同一建筑物中工作。我在用户表和工作表中都有BranchId字段,我可以轻松检查,但在哪里?
  5. 基本上我不知道如何构建我的代码。我想我在这里缺少一些大事,因为每个人都会验证他们的数据并过滤他们的输入。

    由于

1 个答案:

答案 0 :(得分:0)

通过验证装饰您的dtos。 Modelbinding将自动验证您的数据,如果失败将返回验证失败的属性以及您可以自定义的原因。您的业​​务规则需要在逻辑层中进行,逻辑层基本上将对您的数据模型进行操作并返回dtos。您的逻辑层将接受dtos,这将提供与Web API / mvc

的数据层分离