2016-04-12 21 views
3

"Bankalar" ile doğrudan ilişkisi olan bir modele postalanan bilgileri eklemeye çalıştığımda, mükemmel bir şekilde çalışır. Otomatik uygulamaya CRUD işlemleriModel görünümünde yer almayan Dropdownlist modelinden postalanan kimliği alma

ile çalışıyor direkt model için

Kod parçacıkları

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; } 
} 

Denetleyici:

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); 
} 

Ama yüz sorun ben bunu uygulamak çalıştığınızda olmasıdır:

Bu modelViewBu yalnızca açılan listeden banka bilgilerini gösterir. Bilgiler "Gönder" butonu ile gönderildiğinde, bankid'in null olamayacağı konusunda bana bir hata verir. El ile tüm açılan liste öğeleri 1 (ex: _OrganizationUserSignedBy.Organization.BankID = 1;) olacağını, el ile eklediyseniz, test ettim. Sorun şu ki, ModelView'de yayınlanan bilgiler doğru şekilde alınmadı.

Modelview kod parçalarını:

Kontrolör

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); 
} 

oluştur Görünüm:

@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) 

şimdi bir hafta boyunca bu çıkış yolu ararken Been ve çözüm bulamıyorum .. Herhangi bir yardım takdir edilecektir ve şimdi ya da gelecek için herhangi bir ipucu varsa çok takdir ediyorum. Teşekkür ederim!

Not: Bazı kodlar kesildi, bu nedenle sorunun nerede yarayacağını anlamak için çok uzun sürmeyecek.

cevap

1

Modelinizle ilişkisi olmayan ad özelliklerine sahip <select> öğeleriniz. Örneğin İlki

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

ama modeliniz bir özellik göründüğü Organization adında bir özellik var, ancak bir özellik BankID adlandırılmış olması (BankID adlandırılmış sahip değil. Eğer iddialara rağmen

, senin ilk uygulama doğru olarak çalışmaz.Nedeniyle bağlandığınız özellik için aynı adı ve SelectList adını kullanamazsınız (örneğin, istemci tarafı doğrulaması almazsınız) ve her zaman form içeren görünümler için bir görünüm modeli kullanmalısınız. (ve bu görünüm modeli, SelectList özelliklerinin her birinin özelliklerini içerecektir). Dition, bir veri modelinin bir özelliğine bağlayıcı olmamalıdır. Organization'un özelliklerinden herhangi biri doğrulama özniteliğine sahipse, ModelState geçersiz olacaktır.

görünümünüz modeli

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; } 
    ..... 
} 

ve denetleyici

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"); 
    .... 
} 

ve görünümde olmalı

@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" /> 
}