0

私のドメイン モデルは、1 つ以上の CompanyAdmin エンティティを持つ Company エンティティです。

フォームの値を投稿するときに既定のモデル バインダーが機能するには、CompanyAdmin エンティティに一意の名前が必要であることがわかりました。

このページを初めて閲覧するとき、Company または 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>

4

1 に答える 1

1

OK - 問題はビューにありました

これは機能します

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

これはしません

@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
于 2013-02-02T16:16:43.177 に答える