Asp.net mvc 4 通过向控制器发送ViewModel更新存储库模式模型-如何发送回上下文?
我有一个带有/Admin/NewCourse页面的Admin部分,我想使用该页面通过表单保存新添加的课程详细信息。课程模型是使用POCO首先使用存储库模式创建的 我认为我有以下几点:Asp.net mvc 4 通过向控制器发送ViewModel更新存储库模式模型-如何发送回上下文?,asp.net-mvc-4,mvvm,repository-pattern,dbcontext,Asp.net Mvc 4,Mvvm,Repository Pattern,Dbcontext,我有一个带有/Admin/NewCourse页面的Admin部分,我想使用该页面通过表单保存新添加的课程详细信息。课程模型是使用POCO首先使用存储库模式创建的 我认为我有以下几点: @using(Html.BeginForm("NewCourse","Admin",FormMethod.Post)) { <div class="row"> <div class="twelve columns"> &
@using(Html.BeginForm("NewCourse","Admin",FormMethod.Post))
{
<div class="row">
<div class="twelve columns">
<div class="row">
<div class="six columns">
@Html.LabelFor(c => c.Course.Name)
@Html.TextBoxFor(c => c.Course.Name)
</div>
<div class="six columns">
@Html.LabelFor(c => c.Course.Author)
@Html.TextBoxFor(c => c.Course.Author)
</div>
<div class="row">
<div class="six columns">
@Html.LabelFor(c => c.Course.UploadDate)
@Html.TextBoxFor(c => c.Course.UploadDate)
</div>
<div class="six columns">
@Html.LabelFor(c => c.Course.ExpiryDate)
@Html.TextBoxFor(c => c.Course.ExpiryDate)
</div>
</div>
<div class="row">
<div class="twelve columns">
@Html.LabelFor(c => c.Course.Description)
@Html.TextAreaFor(c => c.Course.Description)
</div>
</div>
<div class="row">
<div class="six columns">
@Html.LabelFor(c => c.Course.ParticipationPoints)
@Html.TextBoxFor(c => c.Course.ParticipationPoints)
</div>
</div>
</div>
</div>
<input type="submit" value="Submit button"/>
</div>
}
从上面的帖子中可以看到,我正在传递一个AdminViewModel,其中包含以下代码行:
private Repository<Course> courseRepository;
private-Repository-courseRepository;
如何在控制器中更新我的POST方法,以将新课程的更改保存到courseRepository列表中?您可以阅读我的代码,我使用存储库模式 这是我的控制器
[Authorize]
public ActionResult EditUser(int UserID)
{
List<UserViewModel> UserViewModel = _AccountService.userViewModel(UserID);
return View(UserViewModel.FirstOrDefault());
}
[Authorize]
[HttpPost]
public ActionResult EditUser(UserViewModel updateUser)
{
var UpdateData = _AccountService.UpdateDataUser(updateUser.UserID, updateUser.FullName, updateUser.Email, updateUser.IsActive, updateUser.IsMaster);
if (UpdateData != null)
{
return RedirectToAction("Users");
}
return View(UpdateData);
}
[授权]
公共操作结果EditUser(int UserID)
{
List UserViewModel=\u AccountService.UserViewModel(UserID);
返回视图(UserViewModel.FirstOrDefault());
}
[授权]
[HttpPost]
公共操作结果EditUser(UserViewModel updateUser)
{
var UpdateData=_AccountService.updatedautuser(updateUser.UserID、updateUser.FullName、updateUser.Email、updateUser.IsActive、updateUser.IsMaster);
如果(UpdateData!=null)
{
返回重定向操作(“用户”);
}
返回视图(更新数据);
}
这是我的服务课\
public List<UserViewModel> userViewModel(int UserID)
{
List<User> user = (from d in _UserRepository.All()
where d.UserID == UserID
select d).ToList();
List<UserViewModel> userViewModel = new List<UserViewModel>();
foreach(User users in user)
{
userViewModel.Add(new UserViewModel
{
Email = users.Email,
FullName = users.FullName,
UserName = users.UserName,
UserPassword = users.UserPassword,
UserID = users.UserID,
HotelID = users.HotelID,
IsActive = users.IsActiveq,
IsMaster = users.IsMaster
});
}
return userViewModel;
}
public User UpdateDataUser(int UserID,string FullName, string Email, bool Active, bool MasterUser)
{
User user = (from d in _UserRepository.All()
where d.UserID == UserID
select d).Single();
var updateData = new UserViewModel
{
UserID = UserID,
FullName = FullName,
Email = Email,
IsActive = Active,
IsMaster = MasterUser
};
user.UserID = updateData.UserID;
user.FullName = updateData.FullName;
user.Email = updateData.Email;
user.IsActiveq = updateData.IsActive;
user.IsMaster = updateData.IsMaster;
_UserRepository.Attach(user);
_UserRepository.CommitChanges();
return user;
}
公共列表userViewModel(int UserID)
{
List user=(来自_UserRepository.All()中的d)
其中d.UserID==UserID
选择d).ToList();
List userViewModel=new List();
foreach(用户中的用户)
{
添加(新的userViewModel)
{
Email=用户。Email,
FullName=users.FullName,
UserName=users.UserName,
UserPassword=users.UserPassword,
UserID=users.UserID,
HotelID=users.HotelID,
IsActive=users.IsActiveq,
IsMaster=users.IsMaster
});
}
返回userViewModel;
}
公共用户UpdateDautaser(int用户ID、字符串全名、字符串电子邮件、bool活动、bool主用户)
{
User User=(来自_UserRepository.All()中的d)
其中d.UserID==UserID
选择d.Single();
var updateData=新用户视图模型
{
UserID=UserID,
全名=全名,
电子邮件=电子邮件,
i活动=活动,
IsMaster=主用户
};
user.UserID=updateData.UserID;
user.FullName=updateData.FullName;
user.Email=updateData.Email;
user.IsActiveq=updateData.IsActive;
user.IsMaster=updateData.IsMaster;
_UserRepository.Attach(用户);
_UserRepository.CommitChanges();
返回用户;
}
这取决于存储库的实现以及是否实现了save方法
在我的存储库模式实现中,我是通过t4脚手架实现的。它有以下两种方法来处理插入或更新
public void InsertOrUpdate(TEntity entity)
{
dynamic ent = entity;
if (ent.Id == default(System.Guid)) {
// New entity
ent.Id = Guid.NewGuid();
_context.Set<TEntity>().Add(ent);
} else {
// Existing entity
_context.Entry(ent).State = EntityState.Modified;
}
}
public void Save()
{
_context.SaveChanges();
}
public void InsertOrUpdate(tenty实体)
{
动态ent=实体;
if(ent.Id==默认值(System.Guid)){
//新实体
ent.Id=Guid.NewGuid();
_context.Set().Add(ent);
}否则{
//现有实体
_context.Entry(ent.State=EntityState.Modified;
}
}
公共作废保存()
{
_SaveChanges();
}
因此,我首先通过传递新创建的实体来调用insert或update方法。
然后调用save方法,该方法将保存该上下文中的更改
希望有帮助
干杯,
Amila尝试返回视图(newCourse)我收到错误:没有为此对象定义无参数构造函数。是否将数据添加到数据库并保存更改?是,这给了我一个无参数构造函数错误。我能够访问dbcontext的唯一方法是在控制器中再次声明它,这对我来说似乎不正确,但即使这样,更改也无法保存。您可以使用repository模式查看我的代码。我希望可以帮助您。我使用的是ViewModel作为POST方法的参数,而不是模型。我需要将其保存回模型存储库。我认为你的例子就是简单地使用这个模型。我不知道如何将其与我的问题联系起来。我的存储库类中有以下两种方法。public void Add(T entity){if(entity==null)抛出新的ArgumentException(“entity”);_dbset.Add(entity)}public void SaveChanges(){u context.SaveChanges();}我的问题是我不确定如何从控制器调用它们。当我这样做的时候,我得到了一个为这个对象定义的无参数方法。请按照我前面给出的定义这两个函数。然后,在要保存更改数据的控制器post操作中,在对实体进行更改后,将该实体传递给InsertOrUpdate函数。将存储库实例化为全局变量还是局部变量并不重要。调用InsertOrUpdate函数后,调用Save函数。这将把您的数据保存到数据库中。
public void InsertOrUpdate(TEntity entity)
{
dynamic ent = entity;
if (ent.Id == default(System.Guid)) {
// New entity
ent.Id = Guid.NewGuid();
_context.Set<TEntity>().Add(ent);
} else {
// Existing entity
_context.Entry(ent).State = EntityState.Modified;
}
}
public void Save()
{
_context.SaveChanges();
}