C# 对ASP.NET MVC中的内容放在哪里有些困惑
我正在开发我的第一个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个号码存储在数据库中,但当我通过视图向用户显示时,我会将其
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以向用户显示UIId
、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
的薄层积垢层类型这些并不重要,它们只是用来说明工作流程: