2016-04-27 4 views
0

従業員が働く会社を指定できるドロップダウンリストを作成しようとしています。以下は私のEmployeeViewModelです。 CompanyIdは、Companyテーブルにリンクする外部キーの制約付きデータベースフィールドです。ドロップダウンリストの値がMVC 5のデータベースに作成されていないようです

public class EmployeeViewModel 
{ 
    public EmployeeViewModel() 
    { 

    } 

    public EmployeeViewModel(Employee Employee, string CompanyName) 
    { 
     Initialize(Employee, CompanyName); 
    } 

    public EmployeeViewModel(Employee Employee, CliFFEntities db) 
    { 
     Initialize(Employee, db.Companies.Find(Employee.CompanyId).Name); 
    } 

    private void Initialize(Employee employee, string CompanyName) 
    { 
     this.Id = employee.Id; 
     this.Name = employee.Name; 
     this.CompanyId = employee.CompanyId; 
     this.InternalId = employee.InternalId; 
     this.CompanyName = CompanyName; 
    } 


    public int Id { get; set; } 
    public string Name { get; set; } 
    public Nullable<int> InternalId { get; set; } 

    [Display(Name = "Company")] 
    public int CompanyId { get; set; } 

    public String CompanyName { get; set; } 

    //public List<Company> CompanyList { get; set; } 
    public IEnumerable<SelectListItem> CompanyList { get; set; } //to be set in controller on an as-needed basis 
} 

従業員コントローラの関連部分:

// GET: Employees/Create 
    public ActionResult Create() 
    { 
     var evm = new EmployeeViewModel(); 
     evm.CompanyList = new SelectList(db.Companies, "Id", "Name"); 
     return View(evm); 
    } 

私のビューを作成する関連部分:

<div class="form-group"> 
     @Html.LabelFor(m => m.CompanyId) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(m => m.CompanyId, Model.CompanyList) 
      @Html.ValidationMessageFor(m => m.CompanyId) 
     </div> 
    </div> 

正常に動作するようですだからすべて。実際、投稿データを見ると、データベースの会社IDに対応するCompanyIdを正しい値に設定することさえできます。

しかし、私がデータベース側で外部キーを強制すると、CompanyIdが従業員レコードにそれを作成しないように見えるため、外部キーがエラーになります。 FK制約を無効にすると、CompanyIdは0として表示されます。

何が得られますか?

+1

私はあなたのPOSTメソッドを見ることができますか? –

+0

ビューモデルをデータモデルにどのようにマッピングしていますか?どのようにデータモデルを保存していますか?あなたはあなたのPOSTメソッドを示す必要があります –

+0

ありがとう、スティーブス。どうやら私はPOSTメソッドに注意を払っていませんでした。私はMVCのスーパーです!私は自分自身の質問に答えを投稿しました。 –

答えて

0

私はMVC 5には新しくて、私はポストメソッドのようなことがわからないようです。 EmployeeViewModelを従業員にマップするために変更したものを次に示します。

// POST: Employees/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Name,CompanyId,InternalId")] EmployeeViewModel evm) 
    { 
     var employee = new Employee { Name = evm.Name, CompanyId = evm.CompanyId, InternalId = evm.InternalId }; 
     if (ModelState.IsValid) 
     { 
      db.Employees.Add(employee); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(employee); 
    } 
+0

ひどい 'BindAttribute'を削除してください(ビューモデルを使用する場合は不要です)。 'ModelState'が有効でない場合、' return View(evm);が必要です。ビューを返す場合はビューモデルの 'SelectList'プロパティを再割り当てする必要があります。それ以外の場合は例外がスローされます –

+0

@StephenMueckeというフィードバックに感謝します。 –

関連する問題