我在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
中。但对于View
,Create
和Update
操作,我应该将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; }
}
答案 0 :(得分:0)
Create
视图中的模型是UserViewModel
,应该传递给控制器,而不是User
。
您设置的模式表明用户在输入新用户信息时将首先进入Create
视图。因此,他们将导航到此视图,而不会在第一次旅行时将任何对象传递给它。如果是这种情况,那么您首先需要一个无参数构造函数,您只需创建一个新的UserViewModel
并将其传入。然后您将导航回来在创建用户之后,这个视图将向他们呈现一个表单,并且对用户体验非常困惑。您可能希望重定向到确认页面或登录页面,并显示用户创建的消息。
每当您对数据进行更改时,EntityFramework都不会进行这些更改,直到您在存储库上调用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
}