使用新的子实体发布新实体

时间:2013-02-02 11:51:16

标签: asp.net-mvc razor-2

我的域模型是具有一个或多个CompanyAdmin实体的公司实体。

我意识到,对于在发布表单值时默认的模型绑定器,CompanyAdmin实体必须具有唯一的名称。

首次浏览该页面时,公司或CompanyAdmin都没有数据。这意味着,此代码在视图中不起作用,因此不显示输入文本框。

@Html.EditorFor(model => model.Company.CompanyContacts)

因此,要使它们显示我使用:

@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)

但是,现在问题是在POST时模型绑定不起作用。我能找到的所有例子都使用已经创建的数据。

我怎样才能让它发挥作用?

视图模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ContractorDirect.Models
{
  public class CompanyAdminViewModel
  {
    public Company Company { get; set; }
    public RegisterModel UserReg { get; set; }
  }
}

控制器

public ViewResult CompanyAdmin(int? id)
    {
        CompanyAdminViewModel cavm = new CompanyAdminViewModel();

        jobTitleRepository = new JobTitleRepository();
        companyContactRepository = new CompanyContactRepository();

        var jobtitles = jobTitleRepository.All;
        ViewBag.JobTitleId = new SelectList(jobtitles, "JobTitleId", "JobName");

        if (id.HasValue)
        {
            cavm.Company = companyRepository.Find((int)id);
            cavm.Company.CompanyContacts = companyContactRepository.All.Where(admin=>admin.IsCompanyAdmin).ToList();
            return View(cavm);
        }

        cavm.Company = new Company();
        cavm.Company.CompanyContacts = new List<CompanyContact>();
        cavm.UserReg = new RegisterModel();
        return View(cavm);
    }

    [HttpPost]
    public ActionResult CompanyAdmin(CompanyAdminViewModel cavm)
    {
        JobTitleRepository rep = new JobTitleRepository();
        var jobtitles = rep.All;
        ViewBag.JobTitleId = new SelectList(jobtitles, "JobTitleId", "JobName");

        cavm.UserReg.UserName = cavm.Company.CompanyContacts.ElementAt(0).Email;

        if (ModelState.IsValid)
        {
            AccountController account = new AccountController();
            account.Register(cavm.UserReg, "CompanyAdmin");
            companyRepository.InsertOrUpdate(cavm.Company);
            companyRepository.Save();
            return RedirectToAction("CompanyRegistrationConfirmation");
        }
        else
        {
            return View();
        }
    }

查看

  @model ContractorDirect.Models.CompanyAdminViewModel

  @{
       ViewBag.Title = "CompanyAdmin";
   }

 <h2>Company Admin</h2>

 <table>
 <tr style="vertical-align: top">
    <td>
        <div class="editor-label">
            @Html.LabelFor(model => model.Company.CompanyName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Company.CompanyName)
            @Html.ValidationMessageFor(model => model.Company.CompanyName)
        </div>

        <fieldset>
            <legend>Company Administrator</legend>



            <div class="editor-label">
                @Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).JobTitleId)
            </div>
            <div class="editor-field">
                @Html.DropDownList("JobTitleId", string.Empty)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
                @Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
                @Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
                @Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
                @Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.UserReg.Password)
            </div>

            <div class="editor-field">
                @Html.EditorFor(model => model.UserReg.Password)
                @Html.ValidationMessageFor(model => model.UserReg.Password)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.UserReg.ConfirmPassword)
            </div>

            <div class="editor-field">
                @Html.EditorFor(model => model.UserReg.ConfirmPassword)
                @Html.ValidationMessageFor(model => model.UserReg.ConfirmPassword)
            </div>

        </fieldset>
    </td>
</tr>

1 个答案:

答案 0 :(得分:1)

好的 - 问题出在视图中

这有效

@Html.EditorFor(model => model.Company.CompanyContacts[0].FirstName)

这不是

@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)