Asp.net mvc 4 通过向控制器发送ViewModel更新存储库模式模型-如何发送回上下文?

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"> &

我有一个带有/Admin/NewCourse页面的Admin部分,我想使用该页面通过表单保存新添加的课程详细信息。课程模型是使用POCO首先使用存储库模式创建的

我认为我有以下几点:

@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();
    }