【问题标题】:asp.net mvc 3 entity framework, passing model info in Get request of create actionasp.net mvc 3 实体框架,在创建操作的获取请求中传递模型信息
【发布时间】:2011-08-24 11:32:02
【问题描述】:

我在将视图信息从获取/创建操作传递到视图时遇到问题。这是我的三个模型类;

public class Competition
{
    public int Id { get; set; }
    public int CompetitionId { get; set; }
    public string Name { get; set; }
    public string Prize { get; set; }
}

public class CompetitionEntry
{
    public int Id { get; set; }
    public int CompetitionEntryId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int CompetitionId { get; set; }
}

public class CompetitionEntryViewModel
{
    public int Id { get; set; }
    public Competition Competitions { get; set; }
    public int CompetitionId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; } 
}

这是我在 CompetitionEntry 控制器中的 Get/Create 操作;

public ActionResult Create(int id)
{
    CompetitionEntryViewModel competitionentryviewmodel = db.CompetitionEntriesView.Find(id);
    return View(competitionentryviewmodel);
}

我知道这行不通。 id 参数很好地进入 URL。如何在 th Get 操作中访问我的竞赛课程?我需要能够在我的创建比赛条目视图中显示比赛名称。

提前致谢!

【问题讨论】:

  • 我不希望从 db 上下文中检索 ViewModel 类,而是将检索到的实体放在一起。
  • 感谢您的回复。我对这一切都很陌生,但我稍后会编辑我的项目和我的问题
  • 我认为我在下面的答案下留下的评论更好地解释了我的意图..

标签: asp.net-mvc-3 entity-framework-4 ef-code-first


【解决方案1】:
public ActionResult Create(int id)
{
      var data = db.CompetitionEntriesView.Find(id);

      CompetitionEntryViewModel competitionentryviewmodel = new CompetitionEntryViewModel();
      competitionentryviewmodel.CompetitionName = data.Name;

      return View(competitionentryviewmodel);
}

【讨论】:

  • 感谢您的回复,您的意思是 ViewBag 吗? Viewstate 给出错误,“无法解决”。
  • 抱歉,确实如此。 ViewState、ViewData、ViewBag....有时会让人感到困惑。
  • 确实如此!我试过这个,但我想做的是通过我的 CompetitionEntryViewmodel 中的导航属性 public Competition Competitions 获取比赛的名称,这样我就可以在我的 Create View 中写 @Model.Competition.Name 。但我收到“对象未设置为..”错误。我需要通过我的 Get/Create 操作将 Competition.Name 属性传递到视图中,我只是不知道如何。
  • 我更改了答案以反映您需要的解决方案。或者至少可以为您指明正确的方向。
  • 谢谢,如果它让我走上正轨,我会尝试并标记为答案,谢谢!
【解决方案2】:

您要做的是构建一个对象图并通过视图模型显示它。为此,您需要将域模型映射到视图模型。

您可以通过编写大量代码(重新发明轮子)自己进行映射,或者,您可以考虑使用第三方工具为您执行此操作。我建议您使用 AutoMapper,因为它使用 imo 非常简单。

另一个问题是您的视图模型包含域模型。这很可能在不久的将来让你很头疼。如果我是你,我会用 CompetitionViewModel 代替 Competition。

我还会考虑为比赛列表创建一个视图模型,即 CompetitionsViewModel。查看部分视图以了解如何显示比赛列表。

祝你好运

【讨论】:

  • 感谢您的建议。我会研究一下自动映射器。
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2011-07-22
  • 2012-04-10
  • 2012-02-19
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多