MVC多模型

时间:2013-11-12 19:59:51

标签: asp.net-mvc asp.net-mvc-4

我在创建多个模型视图时遇到问题

我创建了3个模型,然后创建了一个多模型:

public partial class DetailsModel
{
    public ANIME MyANIME { get; set; }
    public CHARACTER MyCHARACTER { get; set; }
    public ACTORS MyACTORS { get; set; }
}

之后我在Controller中添加了行:

    public ActionResult Details(int id)
    {
        DetailsModel myDetailsModel = new DetailsModel();
            return View(myDetailModel);
    }

之后的观点:

<div class="editor-label">
    @Html.LabelFor(model => model.MyANIME.TITLE_OR)
</div>
<div>
    @Html.DisplayFor(model => model.MyANIME.TITLE_OR)
</div>

但是,当我启动它时,数据总是空的......任何想法有什么问题?

2 个答案:

答案 0 :(得分:2)

这会创建模型的实例:

DetailsModel myDetailsModel = new DetailsModel();

但那个例子包括什么?对于初学者来说,该模型中的三个属性都是引用类型,因此无论如何它们都将默认为null。因此,在视图中,model.MyANIMEnull。您可以通过始终初始化属性来修复 小部分(例如,在默认构造函数中):

public partial class DetailsModel
{
    public ANIME MyANIME { get; set; }
    public CHARACTER MyCHARACTER { get; set; }
    public ACTORS MyACTORS { get; set; }

    public DetailsModel()
    {
        MyANIME = new ANIME();
        MyCHARACTER = new CHARACTER();
        MyACTORS = new ACTORS();
    }
}

但实际上并没有用有意义的数据填充它们。例如,如果TITLE_ORstring,那么即使在这种情况下,model.MyANIME.TITLE_OR仍然是null(或者,最好是空字符串)。

无论您希望在该页面上显示什么数据,您都需要从某处获取该数据,并使用该数据填充模型。然后它将在页面上显示。例如,如果您在控制器中执行此操作,那么您将在页面上看到示例值:

DetailsModel myDetailsModel = new DetailsModel();
myDetailsModel.MyANIME = new ANIME();
myDetailsModel.MyANIME.TITLE_OR = "sample title";
return View(myDetailsModel);

答案 1 :(得分:0)

我认为类ANIMECHARACTERACTORS是您的实体框架上下文使用的实体。在这种情况下,请use proper casing,pascal案例。

您必须使用正确的AnimeCharacterActors填充ViewModel。仍然假设实体框架,您的控制器将看起来像这样:

public ActionResult Details(int id)
{
    using (var dbContext = new YourContext())
    {
        DetailsModel viewModel = new DetailsModel();

        viewModel.Anime = dbContext.Anime.FirstOrDefault(a => a.ID == id);
        viewModel.Character = dbContext.Characters.FirstOrDefault(a => a.ID == id);
        viewModel.Actors = dbContext.Actors.FirstOrDefault(a => a.ID == id);

        return View(viewModel);
    }
}

当然你想要改变每个实体的查询,你可能不想在你的视图中使用实体,而数据源应该注入控制器的构造函数中,但我想这就是你的'重新开始。