使用存储库和映射实现MVC设计模式,C#

时间:2017-08-06 11:52:44

标签: c# asp.net asp.net-mvc entity-framework crud

我在ASP.Net MVC项目中使用存储库,视图模型和映射来实现CRUD操作时遇到问题。 "详细信息"(读取有关一个对象的信息)和"索引"(读取整个对象列表),控制器正在工作。

我正在将<div class="main"> <div class="first-div" id="thediv"> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> <a>Element</a> </div> <div class="second-div" onClick="change()"> <i>Icon</i> </div> </div> .main { height: 150px; border: 1px solid red; } .first-div { display: inline-block; width: calc(100% - 70px); border: 1px solid blue; white-space: nowrap; overflow: hidden; } .second-div { border: 1px solid blue; display: inline-block; float: right; width: 50px; } var toggle= true; function change() { if (toggle){ document.getElementById("thediv").style.whiteSpace = "normal"; document.getElementById("thediv").style.overflow = "auto"; toggle = !toggle; } else { document.getElementById("thediv").style.whiteSpace = "nowrap"; document.getElementById("thediv").style.overflow = "hidden"; toggle = !toggle; } } 映射到Model,然后将其显示在ViewModel中。但对于ViewCreateUpdate操作,我应该将Delete映射到ViewModel。你能告诉我哪里错了吗?

型号

Model

基础资料库

 public class User
 {
     [Key]
     public int Id { get; set; }

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

     [Unique]
     [Required]
     [MaxLength(100)]
     public string Email { get; set; }

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

     public string Phone { get; set; }

     public bool IsAdmin { get; set; }
}

存储库接口

public class BaseRepository<T> : IBaseRepository<T> where T : class
{
    private RushHourContext db = null;
    private DbSet<T> table = null;

    public BaseRepository()
    {
        this.db = new RushHourContext();
        table = db.Set<T>();
    }

    public BaseRepository(RushHourContext db)
    {
        this.db = db;
        table = db.Set<T>();
    }

    public IEnumerable<T> SelectAll()
    {
        return table.ToList();
    }

    public T SelectByID(object id)
    {
        return table.Find(id);
    }

    public void Insert(T obj)
    {
        table.Add(obj);
    }

    public void Update(T obj)
    {
        table.Attach(obj);
        db.Entry(obj).State = EntityState.Modified;
    }

    public void Delete(object id)
    {
        T existing = table.Find(id);
        table.Remove(existing);
    }

    public void Save()
    {
        db.SaveChanges();
    }
}

控制器

public interface IBaseRepository<T> where T : class
{
    IEnumerable<T> SelectAll();
    T SelectByID(object id);
    void Insert(T obj);
    void Update(T obj);
    void Delete(object id);
    void Save();
}

UserViewModel

   private RushHourContext _db = new RushHourContext();
   private IBaseRepository<User> _repository = null;

   public UsersController()
   {
       this._repository = new BaseRepository<User>();
   }

   public ActionResult Index()
   {
       if (!LoginUserSession.IsStateAdmin)
       {
           return RedirectToAction("Login");
       }
       var users = _repository.SelectAll().ToList();
       var userViewModel = Mapper.Map<List<UserViewModel>>(users);
       return View(userViewModel);
   }

   public ActionResult Details(int? id)
   {
       var users = _repository.SelectByID(id);

       var userViewModel = Mapper.Map<UserViewModel>(users);
       return View(userViewModel);
   }

   public ActionResult Create(User user)
   {
       var users = _repository.Insert(user); // THIS CODE HERE IS WRONG

       var userViewModel = Mapper.Map<User>(users);

       return View(userViewModel);
   }

查看

public class UserViewModel
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter User Name.")]
    [Display(Name = "User Name")]
    public string Name { get; set; }

    [MaxLength(100)]
    [Display(Name = "Email Address")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "Password")]
    public string Password { get; set; }

    public string Phone { get; set; }

    public bool IsAdmin { get; set; }
}

3 个答案:

答案 0 :(得分:0)

  1. Create视图中的模型是UserViewModel,应该传递给控制器​​,而不是User

  2. 您设置的模式表明用户在输入新用户信息时将首先进入Create视图。因此,他们将导航到此视图,而不会在第一次旅行时将任何对象传递给它。如果是这种情况,那么您首先需要一个无参数构造函数,您只需创建一个新的UserViewModel并将其传入。然后您将导航回来在创建用户之后,这个视图将向他们呈现一个表单,并且对用户体验非常困惑。您可能希望重定向到确认页面或登录页面,并显示用户创建的消息。

  3. 每当您对数据进行更改时,EntityFramework都不会进行这些更改,直到您在存储库上调用SaveChanges为止。奇怪的是,您在创建新用户后不会立即将其保存。

  4. DbSet.Add

    DbContext.SaveChanges

答案 1 :(得分:0)

对于创建函数,请使用UserViewModel而不是User。然后从UserViewModel映射到User以插入数据库。之后,如果要显示已保存的数据,请返回UserViewModel对象。

请尝试以下代码。

[HttpPost]
public ActionResult Create(UserViewModel userViewModel)
{ 
   var user = new User();
   var newUser = Mapper.Map(userViewModel, user); 
  _repository.Insert(newUser);
  _repository.Save();
  return View(userViewModel);
}

答案 2 :(得分:0)

你可以这样做:

$Packages = @()

$Packages += @("program 1","c:\path\to\program.exe","/switch")
$Packages += @("program 2","c:\path\to\program2.exe","/switch")

foreach ($Package in $Packages) {
    $Name, $Path, $Args = $Package
    Install-Program $Name $Path $Args
}