如何使用mvc viewmodel以相同的形式保存和更新记录

时间:2014-12-08 08:41:40

标签: asp.net-mvc

    public int ID { get; set; }

    [Required]
    public string Surname{get;set;}

    [Required (ErrorMessage="FirstName Required")]
    public string Firstname{get;set;}

    [Required(ErrorMessage="please enter your OtherNames")]
    public string Othername{get;set;}

    [Required(ErrorMessage="please enter your sex")]
     public string Sex{get;set;}

    [Required (ErrorMessage="please enter your DateOfBirth")]
    public DateTime DateOfBirth{get;set;}

   [Required(ErrorMessage="Address is required")]
  public string Address{get;set;}

   [Required(ErrorMessage="city is required")]
    public string City{get;set;}

    [Required(ErrorMessage="State is required")]
    public string State{get;set;}

    public string Country{get;set;}


}

我创建了一个界面,充当我的域层和我的WEBUI之间的中间人

 public interface IStudentRepository
    {

       IQueryable<Student> Student { get;  }
       //we using a method to save the record into our database
       void Save(Student student);


    }

接口由我的存储库类实现,该类执行将记录保存到数据库并检索它的所有操作。

public class EFRepository:IStudentRepository
    {
       private EFDBContext context = new EFDBContext();

       public IQueryable<Student> Student{ get { return context.Students; } }


       public void Save(Student student)
       {

           if (student.ID == 0)
           {

               context.Students.Add(student);
           }

           context.SaveChanges();

       }

然后我有一个视图,它创建了一个学生类的实例,并使用该接口将记录存储在数据库中,这完全有效。

  [HttpPost]
        public ActionResult Registration(Student student)
        {

            if (ModelState.IsValid)
            {

                studentrepository.Save(student);
            }
            return View(student);
        }

这对我来说很完美..

但是我希望能够更新这些相同的字段,以便学生对字段进行更改,并且应该覆盖数据库中的现有记录。 我已经看过我的教程,其中学生ID号作为动作链接传递,然后覆盖现有记录。

然而,我想要的是学生能够使用相同的按钮编辑相同的表格,并显示相同的视图。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您只需要将存储库方法更改为如下所示:

public class EFRepository:IStudentRepository
{
    private EFDBContext context = new EFDBContext();

    public IQueryable<Student> Student{ get { return context.Students; } }


    public void Save(Student student)
    {

       if (student.ID == 0)
       {

            context.Students.Add(student);
       }
       else
       {
           Student existingStudent = context.Students.FirstOrDefault(x => x.ID == student.ID);

           if(existingStudent != null)
           {
               context.Entry(existingStudent).CurrentValues.SetValues(student);
               context.Entry(existingStudent).State = System.Data.Entity.EntityState.Modified;

           }

        }

        context.SaveChanges();
}

或者您可以使用Entity Framework Attach方法,因为这将自动跟踪对象状态并更新详细信息