我有两个具有一对多关系的模型
public class Team
{
public int TeamID { get; set; }
public string Name { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
public class Player
{
public int PlayerID { get; set; }
public string Name { get; set; }
public virtual Team Team { get; set; }
}
我想更改团队的详细信息视图,以便为团队添加新玩家
// GET: /Team/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Player player = db.Players.Find(id);
if (player == null)
{
return HttpNotFound();
}
return View(player);
}
找到这方面的任何信息有点困难,但从我可以收集到的最佳方式来看,这将是添加一个viewmodel
public class TeamViewModel
{
public Team team { get; set; }
public Player player { get; set; }
}
并将其发送到我的详细信息视图,我没有取得多大成功,我不太确定这是否是正确的方法。
非常感谢任何链接或指导。
的更新 的
我已设法让详细信息视图正常工作,但现在需要整理post方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Details(TeamViewModel tvm)
{
if (ModelState.IsValid)
{
tvm.player.team = tvm.team;
db.Players.Add(tvm.player);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(tvm);
}
这将创建新播放器,但不会存储关系,因此播放器表中的列TeamID为空。
更新2
我做了一些调试,似乎我的teamViewModel没有在帖子中存储团队数据。
// GET: /Team/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Team team = db.Teams.Find(id);
if (team == null)
{
return HttpNotFound();
}
var teamViewModel = new TeamViewModel()
{
team = team,
player = new Player() { Team = db.Team.Find(id) }
};
return View(teamViewModel);
}
// POST: /Team/Details/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Details(TeamViewModel teamViewModel)
{
if (ModelState.IsValid)
{
db.Players.Add(teamViewModel.player);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(teamViewModel);
}
答案 0 :(得分:2)
所以你想要做的是以下几点:
您的观看模型:
public class TeamViewModel
{
public Team team { get; set; }
public Player player { get; set; }
}
可以处理这项工作。 应在生成视图之前获取团队数据。 播放器可以为空 - 它只会用于生成视图的输入字段。
你应该更像这样改变你的行动:
// GET: /Team/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Team team= db.Team.Find(id); //assuming that this is the id of the team
if (team== null)
{
return HttpNotFound();
}
var teamViewModel = new TeamViewModel() { Team = team, Player = new Player() };
return View(teamViewModel);
}
使用ViewModels是一种常见做法。由于这一点,您将业务模型与向用户呈现数据时使用的模型分开。然后,您可以聚合所需的所有数据,而不仅限于将一个对象传递给视图。