将新的相关模型添加到现有模型

时间:2014-01-25 10:32:41

标签: c# asp.net-mvc-5

我有两个具有一对多关系的模型

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);
}

1 个答案:

答案 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是一种常见做法。由于这一点,您将业务模型与向用户呈现数据时使用的模型分开。然后,您可以聚合所需的所有数据,而不仅限于将一个对象传递给视图。