单页表单中的多个实体

时间:2014-06-19 20:48:17

标签: c# asp.net-mvc entity-framework model-view-controller

我遇到了一个问题,我无法在视图中显示多个模型,特别是在表单中。我到目前为止采用的方法是使用一个父母"视图以保存与各种模型相关的多个局部视图(使用EF6,VS13)。

然而,由于错误的实施或理解,我似乎无法做到这一点,因为我不断得到每个视图只能与一个模型相关的错误。

- 的模型 -

NewHire:

namespace HROnboarding.Domain.Entities
{
    public class NewHire
    {
        public int NewHireId { get; set; }

        [Required]
        [DisplayName("First Name")]
        public string FirstName { get; set; }
        [Required]
        [DisplayName("Last Name")]
        public string LastName { get; set; }
        public string Department { get; set; }
        public string Position { get; set; }
        [DisplayName("Needs Phone")]
        public bool NeedsPhone { get; set; }
        [DisplayName("Needs Computer")]
        public bool NeedsComputer { get; set; } //Enables SoftwareNeeded, External Devices(Keyboard, mouse, docking station, etc), Resource Permission(text box?), Email groups
        [DisplayName("Needs Credit Card")]
        public bool NeedsCredit { get; set; }
    }
}

SoftwareNeeded:

namespace HROnboarding.Domain.Entities
{
    public class SoftwareNeeded
    {
        //Primitive Properties
        public int SoftwareNeededId { get; set; }
        public string SoftwareName { get; set; } //piece of software (GIMP, VS13, etc)
        public bool IsNeeded { get; set; } //whether or not it is needed by the user
    }
}

- 控制器 -

NewHireController:

namespace HROnboarding.WebUI.Controllers    
{
    public class NewHireController : Controller
    {
        private INewHiresRepository repository;
        public NewHireController(INewHiresRepository newHireRepository)
        {
            //instantiate repository
            this.repository = newHireRepository;
        }
        //
        // GET: /NewHire/
        public ViewResult Index()
        {
            return View(repository.NewHires);
        }

        public ViewResult NewHiresView()
        {
            return View(repository.NewHires);
        }
    }
}

注意:还有一个相应的SoftwareController,与NewHireController相同。

这些模型对应于每个模型看起来像这样的接口(存储库):

namespace HROnboarding.Domain.Interfaces
{
    public interface INewHiresRepository
    {
        IEnumerable<NewHire> NewHires { get; }
        int SaveNewHire(NewHire newHire);
        NewHire GetById(int Id);

    }
}

正如我所说,我试图为每个模型使用部分视图:

@model IEnumerable<HROnboarding.Domain.Entities.NewHire>

@if (Model != null)
{
    <div>
        <table>
            <thead>
                <tr>
                    <th>
                        First Name
                    </th>
                    <th>
                        Last Name
                    </th>
                    <th>
                        Department
                    </th>

                </tr>
            </thead>
            <tbody>
                @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            @item.FirstName
                               .
                               .
                               .

我在每个模型中使用其中一个部分视图,通过主索引视图将它们包装到引用中,如下所示:

@using HROnboarding.Domain.Entities
@using HROnboarding.Domain.Interfaces
@model IEnumerable<HROnboarding.Domain.Entities.NewHire>

<h2>List</h2>
<p>
    <div>
        @Html.Partial("NewHiresView")
    </div>
    <div>
        @*@Html.Partial("Softwares")*@ @*<-------Can't just add this in?*@
    </div>
</p>
@*<p>
    @Html.ActionLink("Create New", "Create")
</p>*@
@*<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)

但是当我将各种部分添加到索引视图中时,我只能添加NewHire。当我添加Softwares视图时,它会抛出一个未处理的异常:

  

附加信息:传递到字典中的模型项是   类型   &#39; {System.Data.Entity.DbSet {1}} 1 [HROnboarding.Domain.Entities.SoftwareNeeded]&#39;

正如我所说,我必须遗漏一些基本的东西,因为我觉得我太复杂了。也不确定这是不是太多&#34;背景信息,但我希望我的问题很清楚。

2 个答案:

答案 0 :(得分:0)

我做同样的事情,唯一的区别我只将一个视图模型传递给我的主视图,然后使用

渲染每个视图模型

@Html.Partial("ViewName", Model)

veiw模型是一些域对象的集合。其中一些视图包含在一个表单中,因此回发完整的模型。和其他人启用ajax,只发送viewModel的部分作为JSON对象。

也许尝试简化您的观点并利用部分

来利用视图模型

答案 1 :(得分:0)

您的根本问题是您正在尝试将数据实体用作视图模型。

您有两种选择:

快速而肮脏:通过ViewBag将您的数据实体传递给视图。

<强>&#34;正确&#34; MVC:为每个View创建ViewModel。模型将包括与您的数据实体对应的属性