2016-04-12 14 views
3

投稿された情報を「銀行」と直接関係のあるモデルに挿入しようとすると、正常に動作します。モデルビューに含まれていないDropdownlistモデルからの投稿IDの取得

public ActionResult Create() 
{ 
    ViewBag.BankID = new SelectList(db.Banks, "ID", "Title"); 
    .... 
    return View(); 
} 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Organization organization) 
{ 
    if (ModelState.IsValid) 
    { 
     organization.OrganizationStatusID = 1; 
     db.Organizations.Add(organization); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.BankID = new SelectList(db.Banks, "ID", "Title", organization.BankID); 
    .... 
    return View(organization); 
} 

しかし、私が直面している問題は、私はそれを実装しようとすることです::自動実装CRUD操作

public class Organization 
{ 
    public int ID { get; set; } 
    .... 
    [Display(Name = "Bank:")] 
    public int BankID { get; set; } 
    public virtual Bank Bank { get; set; } 
    .... 
} 

public class Bank 
{ 
    public int ID { get; set; } 
    [Display(Name = "Bank")] 
    public string Title { get; set; } 
} 

コントローラと正常に動作し、直接モデルの

コードスニペット

public class _OrganizationUserSignedBy 
{ 
    public int ID { get; set; } 
    public Organization Organization { get; set; } 
    .... 
} 

このModelViewでは、銀行情報はドロップダウンリストにのみ表示されます情報が「送信」ボタンを介してポストされると、bankIDがnullではないというエラーが表示されます。手動で挿入すると、選択したすべてのドロップダウンリスト項目が1(例:_OrganizationUserSignedBy.Organization.BankID = 1;)になり、うまくいきました。問題は、投稿された情報がModelViewで正しく受信されないということです。

モデルビューのコードスニペットは:

コントローラ

public ActionResult Create() 
{ 
    ViewBag.BankID = new SelectList(db.Banks, "ID", "Title"); 
    .... 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(_OrganizationUserSignedBy _OrganizationUserSignedBy) 
{ 
    if (ModelState.IsValid) 
    { 
     _OrganizationUserSignedBy.Organization.OrganizationStatusID = 1; 
     db.Organizations.Add(_OrganizationUserSignedBy.Organization); 
     _OrganizationUserSignedBy.Organization.BankID = 1; 
     .... 
     db.SaveChanges(); 
     _OrganizationUserSignedBy.User.OrganizationID = db.Organizations.Max(x => x.ID); 
     _OrganizationUserSignedBy.SignedBy.OrganizationID = db.Organizations.Max(x => x.ID); 
     db.Users.Add(_OrganizationUserSignedBy.User); 
     db.SignedBys.Add(_OrganizationUserSignedBy.SignedBy); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.BankID = new SelectList(db.Banks, "ID", "Title", _OrganizationUserSignedBy.Organization.BankID); 
    .... 
    return View(_OrganizationUserSignedBy); 
} 

ビューを作成します。

@model MVC_CPO_REGRELEASE.Models._OrganizationUserSignedBy 
.... 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    .... 
    @Html.LabelFor(model => model.Organization.BankID, "*Banko pavadinimas:") 
    @Html.DropDownList("BankID", null, "Pasirinkite...") 
    @Html.ValidationMessageFor(model => model.Organization.BankID) 

が今一週間のためにこれを行う方法を探して、私は解決策を見つけるcan`t ..助けていただければ幸いです。もしあなたが今や将来のためのヒントを持っていれば、私はとても感謝しています。ありがとうございました!

PS:一部のコードが削除されているため、問題がどこにあるのか理解が間に合わないでしょう。

答えて

1

あなたのモデルに関係のない名前属性を持つ<select>要素を作成しています。たとえば、あなたにもかかわらず、最初のものは

<select name="BankID" .... > 

ですが、それはBankIDという名前のプロパティを持っているように見えますOrganizationという名前のプロパティを持っていますが、あなたのモデルは、(BankIDという名前のプロパティを持っていません。

を主張、あなた最初の実装は正しく動作しません。バインドするプロパティに同じ名前とSelectListの名前を使用することはできません(たとえば、クライアント側の検証は行われません)。フォームを含むビューのビューモデルは常に使用する必要があります(そしてそのビューモデルには、SelectListプロパティのそれぞれのプロパティが含まれます)。あなたはデータモデルのプロパティに束縛すべきではありません。 Organizationのいずれかのプロパティに検証属性がある場合、ModelStateは無効になります。

あなたのビューモデルは

public class OrganizationUserSignedByVM 
{ 
    public int? ID { get; set; } // so you can use it in an edit view as well 
    [Display(Name = "Bank")] 
    [Required(ErrorMesage = "Please select a bank")] 
    public int SelectedBank { get; set; } 
    public SelectList BankList { get; set; } 
    ..... 
} 

とコントローラ

public ActionResult Create() 
{ 
    OrganizationUserSignedByVM model= new OrganizationUserSignedByVM(); 
    ConfigureViewModel(model); 
    return View(model); 
} 
public ActionResult Create(OrganizationUserSignedByVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ConfigureViewModel(model); 
     return View(model); 
    } 
    // initialise a new instance of your data model(s) and save 
    // redirect 
} 

private void ConfigureViewModel(OrganizationUserSignedByVM model) 
{ 
    model.BankList = new SelectList(db.Banks, "ID", "Title"); 
    .... 
} 

で、ビューにする必要があります

@model yourAssembly.OrganizationUserSignedByVM 
@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.SelectedBank) 
    @Html.DropDownListFor(m => m.SelectedBank, Model.BankList, "-Please select-") 
    @Html.ValidationMessageFor(m => m.SelectedBank) 
    .... 
    <input type="submit" value="Save" /> 
} 
関連する問題