Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对ASP.NET MVC中的内容放在哪里有些困惑_C#_Asp.net_Sql Server_Asp.net Mvc_Linq To Sql - Fatal编程技术网

C# 对ASP.NET MVC中的内容放在哪里有些困惑

C# 对ASP.NET MVC中的内容放在哪里有些困惑,c#,asp.net,sql-server,asp.net-mvc,linq-to-sql,C#,Asp.net,Sql Server,Asp.net Mvc,Linq To Sql,我正在开发我的第一个ASP.NET MVC应用程序,在创建/更新某些数据时遇到了一些困惑 我有一个数据库表User,一个LinqToSql生成的分部类User,还有我自己的自定义分部类User 我在我的User版本上使用了[Bind(Exclude=“Id,InsertDateTime,UpdateDateTime”)],因为我不希望用户编辑这些字段 我还有一个PhoneNumber字段,我确实希望用户编辑它,但它需要转换。我将其作为10个号码存储在数据库中,但当我通过视图向用户显示时,我会将其

我正在开发我的第一个ASP.NET MVC应用程序,在创建/更新某些数据时遇到了一些困惑

我有一个数据库表
User
,一个LinqToSql生成的分部类
User
,还有我自己的自定义分部类
User

我在我的
User
版本上使用了
[Bind(Exclude=“Id,InsertDateTime,UpdateDateTime”)]
,因为我不希望用户编辑这些字段

我还有一个
PhoneNumber
字段,我确实希望用户编辑它,但它需要转换。我将其作为10个号码存储在数据库中,但当我通过视图向用户显示时,我会将其转换为视图中可读的电话号码,如下所示:

string.Format("{0:(###) ###-####}", Convert.ToInt64(Model.User.PhoneNumber)).
问题是,当用户单击Save时,电话号码的格式总是错误的。在某些地方,我需要去掉所有非数字字符(括号、破折号、斜杠和空格)

问题

对于下面列出的每个字段,我如何处理创建和编辑操作

  • Id
    -我相信这是由SQL Server自动处理的,因为我的所有Id字段都设置为
    IDENTITY(1,1)
    。我没有进行过广泛的测试,但这似乎“很有效”。请确认

  • InsertDateTime
    -我希望将其设置为
    DateTime。现在
    仅用于创建操作,不用于编辑操作。那么,在哪里可以设置这个值:User、UserController、UserFormViewModel或其他什么

  • UpdateDateTime
    -我希望将其设置为
    DateTime。现在
    用于创建和编辑操作,但同样,我应该将执行此分配的代码放在哪里

  • PhoneNumber
    -与上述三个字段不同,此字段可由用户编辑,但需要将其从
    (888)123-4567
    转换为
    8881234567
    ,然后才能进行更新。这里有几个问题:(1)进行此转换的合适位置在哪里?我在视图中将电话号码转换为“用户可读”格式,我应该在哪里将其转换回“数据库存储”格式(2)我是否应该将
    电话号码
    添加到我的
    [绑定(排除…)
    属性中

  • 更新

    从到目前为止的答案来看,我想至少为我自己澄清一些事情

    首先,这里列出了使用
    User
    数据进行操作的位置:

  • User
    数据库中的表-处理Id分配。可以为InsertDateTime和UpdateDateTime提供默认值

  • User
    class-使用
    GetRuleViolations()
    方法处理验证

  • UserRepository
    class-抽象数据持久性函数(get、get all、add、delete和save)

  • UserController
    class-处理用户请求和发布尝试(索引、详细信息、编辑、发布编辑、创建、发布创建和删除)

  • UserFormViewModel
    class-提供要查看的强类型数据(一个
    User
    对象加上下拉菜单的备份数据)

  • Views/User/Create.aspx
    Views/User/Edit.aspx
    -通过组合静态数据和动态数据(存储在视图模型中)生成html以向用户显示UI

  • 我目前的想法是,设置
    Id
    UpdateDateTime
    InsertDateTime
    的责任在概念上取决于模型。数据库肯定负责设置insert上的
    Id
    ,但我仍然有点不清楚日期时间字段应该设置在哪里。似乎有两种选择:存储库(由@Aaronaught建议)或
    User
    类(已经处理验证)

    至于在#############和(########-#######之间转换电话号码的问题,这在概念上更像是一个“视图”函数。我喜欢@Aaronaught关于拥有一个专用的
    PhoneNumberConverter
    类的想法,我可能会同意,但仍然有一个问题,就是谁调用这个类上的方法。为此,我倾向于使用
    UserFormViewModel

    这就引出了下面两个问题

    后续问题

  • 是否应在
    UserRepository
    类或
    User
    类中分配
    UpdateDateTime
    InsertDateTime
    字段

  • UserFormViewModel
    调用电话号码转换方法(在
    PhoneNumberConverter
    类上)有意义吗


  • 以下是我的答案:

    1-是的,您是对的,它是使用SQL server标识规范列“自动增量列”完成的

    2-您可以将DB中此字段的默认值设置为
    getdate()
    sql函数,以便它第一次将该值插入DB中,并采用服务器日期时间值

    3-默认值也可以相同,但在调用submit changes的前一行保存数据的函数中,将此值设置为Datetime.Now


    4-第一部分,我认为合适的位置将在[Post]方法版本上,我认为您不应该将其排除在外。

    通常,您将有一个业务逻辑层,MVCER称之为存储库,它位于控制器和DAL之间。这通常是处理时间戳和数据转换的理想场所

    public class UserRepository : IUserRepository
    {
        private IDatabase db;
    
        public UserRepository(IDatabase db)
        {
            if (db == null)
            {
                throw new ArgumentNullException("db");
            }
            this.db = db;
        }
    
        public void SaveUser(User user)
        {
            int userID = user.ID;
            DateTime createDate = user.CreatedOn;
            DateTime updateDate = DateTime.Now;
            long phoneNumber = PhoneNumberConverter.Parse(user.PhoneNumber);
            using (TransactionScope tsc = new TransactionScope())
            {
                if (user.ID == 0)
                {
                    createDate = updateDate;
                    userID = db.InsertUser(user.Name, phoneNumber, createDate,
                        updateDate);
                }
                else
                {
                    db.UpdateUser(user.ID, user.Name, phoneNumber, updateDate);
                }
                tsc.Complete();
            }
            user.ID = userID;
            user.CreatedOn = createDate;
            user.LastModified = updateDate;
        }
    }
    
    注意,我在这里做了一些“假设”,比如使用
    TransactionScope
    和一些称为
    IDatabase
    的薄层积垢层类型这些并不重要,它们只是用来说明工作流程: