ViewModel 未链接虚拟类
这是我的 ViewModel:
public class PlayerViewModel
{
PlayerRepository repo = new PlayerRepository();
public Player Player { get; set; }
public int SelectedUserID { get; set; }
public SelectList Users { get; set; }
public PlayerViewModel()
{
Player = new Player();
}
public PlayerViewModel(Player player)
{
Player = player;
SelectedUserID = 0;
}
}
这是在我的控制器中(用于编辑):
[Authorize]
public ActionResult Upravit(int id)
{
var player = repo.Retrieve(id);
var playerView = new PlayerViewModel(player);
playerView.Users = new SelectList(repo.GetUsers(), "UserID", "UserName");
return View(playerView);
}
[Authorize,HttpPost]
public ActionResult Upravit(int id, PlayerViewModel playerView)
{
if (ModelState.IsValid)
{
playerView.Player.User = repo.GetUserByID(playerView.SelectedUserID);
repo.Save(playerView.Player);
return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID });
}
return View(playerView);
}
和存储库:
public User GetUserByID(int id)
{
return db.Users.Find(id);
}
public int Save(Player player)
{
db.Entry(player).State = player.PlayerID == 0 ?
EntityState.Added : EntityState.Modified;
db.SaveChanges();
return player.PlayerID;
}
我的问题是我进入 httppost 有效视图模型,我将 User 添加到播放器(它是自定义类,在播放器类中它是虚拟用户用户)并在调试中看起来一切正常(播放器包含正确的用户),但下次当我在其他视图中尝试检索播放器时,它的 User 属性为空。我在数据库中检查了它,并且 UserID 列中没有 int 。那么也许有人可以帮助我问题出在哪里?为什么不保存?
编辑: 我将此代码添加到我的存储库中:
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
并将控制器更改为:
[Authorize,HttpPost]
public ActionResult Upravit(int id, PlayerViewModel playerView)
{
if (ModelState.IsValid)
{
using (PlayerRepository playerRepository = new PlayerRepository())
{
playerView.Player.User = playerRepository.GetUserByID(playerView.SelectedUserID);
playerRepository.Save(playerView.Player);
return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID });
}
}
return View(playerView);
}
但这没有帮助。
编辑2 我的播放器和用户类:
public class User
{
public User()
{
}
public User(int userId, string userName, string firstName, string surname, string password, string email)
{
UserID = userId;
UserName = userName;
Name = firstName;
Surname = surname;
Password = password;
Email = email;
IsActivated = false;
}
[HiddenInput(DisplayValue = false)]
public int UserID { get; set; }
[Display(Name="Uživatelské jméno")]
[Required(ErrorMessage = "Je potřeba vyplnit uživatelské jméno.")]
[StringLength(20)]
public string UserName { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
[Display(Name = "Heslo")]
[DataType(DataType.Password)]
[Required(ErrorMessage = "Je potřeba vyplnit heslo.")]
[StringLength(30)]
public string Password { get; set; }
[Display(Name = "E-mail")]
[DataType(DataType.EmailAddress)]
[Required(ErrorMessage = "Je potřeba vyplnit Váš e-mail.")]
[StringLength(30)]
public string Email { get; set; }
public IIdentity Identity { get; set; }
public string ImagePath { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public virtual ICollection<Topic> Topics { get; set; }
public int RoleId { get; set; }
public virtual Role Role { get; set; }
public bool IsActivated { get; set; }
public string EmailKey { get; set; }
}
}
public class Player
{
[Key]
public int PlayerID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Surname { get; set; }
public string PhotoUrl { get; set; }
public string Post { get; set; }
public virtual Team Team { get; set; }
public virtual User User { get; set; }
}
我在控制器中的每个方法中添加了 using with repo ,并在控制器上添加了 Dispose 方法,现在我在显示数据时遇到问题。例如,当我尝试显示 Player.User.UserName (我已手动向玩家添加一些用户)时,它表示实例 ObjectDataContext 已被处置并且无法使用。
This is my ViewModel:
public class PlayerViewModel
{
PlayerRepository repo = new PlayerRepository();
public Player Player { get; set; }
public int SelectedUserID { get; set; }
public SelectList Users { get; set; }
public PlayerViewModel()
{
Player = new Player();
}
public PlayerViewModel(Player player)
{
Player = player;
SelectedUserID = 0;
}
}
This is in my controller (it´s for editing):
[Authorize]
public ActionResult Upravit(int id)
{
var player = repo.Retrieve(id);
var playerView = new PlayerViewModel(player);
playerView.Users = new SelectList(repo.GetUsers(), "UserID", "UserName");
return View(playerView);
}
[Authorize,HttpPost]
public ActionResult Upravit(int id, PlayerViewModel playerView)
{
if (ModelState.IsValid)
{
playerView.Player.User = repo.GetUserByID(playerView.SelectedUserID);
repo.Save(playerView.Player);
return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID });
}
return View(playerView);
}
and repo:
public User GetUserByID(int id)
{
return db.Users.Find(id);
}
public int Save(Player player)
{
db.Entry(player).State = player.PlayerID == 0 ?
EntityState.Added : EntityState.Modified;
db.SaveChanges();
return player.PlayerID;
}
My problem is that I get in httppost valid viewmodel, I add User to player (it´s custom class and in player class it´s virtual User User) and in debug it looks everything ok (player contains right user) but nexttime when I in other view try to retrieve player it´s property with User is null. I checked it in database and there is no int in column with UserID. So maybe somebody can help me where is problem? Why it´s not saving?
Edit:
I added this code to my repository:
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
and change in controller to this:
[Authorize,HttpPost]
public ActionResult Upravit(int id, PlayerViewModel playerView)
{
if (ModelState.IsValid)
{
using (PlayerRepository playerRepository = new PlayerRepository())
{
playerView.Player.User = playerRepository.GetUserByID(playerView.SelectedUserID);
playerRepository.Save(playerView.Player);
return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID });
}
}
return View(playerView);
}
but it didn´t help.
Edit2
My player and User classes:
public class User
{
public User()
{
}
public User(int userId, string userName, string firstName, string surname, string password, string email)
{
UserID = userId;
UserName = userName;
Name = firstName;
Surname = surname;
Password = password;
Email = email;
IsActivated = false;
}
[HiddenInput(DisplayValue = false)]
public int UserID { get; set; }
[Display(Name="Uživatelské jméno")]
[Required(ErrorMessage = "Je potřeba vyplnit uživatelské jméno.")]
[StringLength(20)]
public string UserName { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
[Display(Name = "Heslo")]
[DataType(DataType.Password)]
[Required(ErrorMessage = "Je potřeba vyplnit heslo.")]
[StringLength(30)]
public string Password { get; set; }
[Display(Name = "E-mail")]
[DataType(DataType.EmailAddress)]
[Required(ErrorMessage = "Je potřeba vyplnit Váš e-mail.")]
[StringLength(30)]
public string Email { get; set; }
public IIdentity Identity { get; set; }
public string ImagePath { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public virtual ICollection<Topic> Topics { get; set; }
public int RoleId { get; set; }
public virtual Role Role { get; set; }
public bool IsActivated { get; set; }
public string EmailKey { get; set; }
}
}
public class Player
{
[Key]
public int PlayerID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Surname { get; set; }
public string PhotoUrl { get; set; }
public string Post { get; set; }
public virtual Team Team { get; set; }
public virtual User User { get; set; }
}
I added using with repo to every method in Controller and added Dispose method on controller and now I have problem with showing data. For example when I tried showing Player.User.UserName (I have manually added some users to players) It says that instance ObjectDataContext was dispose and cant be used.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看来有必要处置
ObjectContext
;否则每次都有不同的ObjectContext
实例,在上下文的对象之间进行查询时可能会遇到问题。为您的 Repository 类实现 IDisposable:调用底层
ObjectContext
类实例的 Dispose 方法。客户端代码:
Update
要简化存储库的处置,只需重写
Controller
派生类的Dispose
方法:调用Dispose
此处的存储库。 ASP.NET MVC 框架将在请求结束时自动调用Controller.Dispose()
。更新
需要定义名为
Id
的属性来定义关系。希望这有帮助。
It seems it is necessary to dispose the
ObjectContext
; otherwise there are a differentObjectContext
instances each time, you can run into problems when doing queries among objects of the contexts.Implement IDisposable for your Repository class: call the Dispose method for underlying
ObjectContext
class instance.Client code:
Update
To simplify disposing of the repository, just override
Dispose
method ofController
-derived class: callDispose
for the repository here. The ASP.NET MVC framework will automatically callController.Dispose()
at the end of the request.Update
It is necessary to define property called
<entity>Id
to define the relationship.Hope this helps.