2015-06-21 61 views
2

我想从html页面上的dropdownList中获取参数并将其发送到我的控制器,创建新的Model对象并将其插入到数据库中。ModelState.isValid - false

这是我的控制器(两种方法来创建My_Model):

public ActionResult Create() 
    { 
     IEnumerable<MusicStyle> musicStyleList = db.MusicStyles.ToList(); 
     ViewData["musicStyles"] = new SelectList(musicStyleList); 
     return View(); 
    } 

    // POST: Bands/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,info,appearanceDate,musicStyles")] Band band) 
    { 
     IEnumerable<MusicStyle> musicStyleList; 
     if (ModelState.IsValid) 
     { 
      musicStyleList = db.MusicStyles; 
      ViewData["musicStyles"] = new SelectList(musicStyleList).ToList(); 
      db.Bands.Add(band); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     musicStyleList = db.MusicStyles; 
     ViewData["musicStyles"] = new SelectList(musicStyleList).ToList(); 
     return View(band); 
    } 

这是我的html页面上下拉列表:

@Html.DropDownList("musicStyles", "select style") 

这是我的模型:

public class Band 
{ 
    [Required] 
    public int id { get; set; } 

    [Required] 
    [RegularExpression(@"^[a-zA-Z-\s\\\/*_]+$")] 
    [StringLength(60, MinimumLength = 1)] 
    public string name { get; set; } 

    public string info { get; set; } 

    [Required] 
    [Display(Name = "Appearance date")] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public DateTime appearanceDate { get; set; } 

    public List<MusicStyle> musicStyles { get; set; } 
    public List<Song> songs { get; set; } 
    public List<Album> albums { get; set; } 
} 

它有一个列表musicStyles(引用多对多),我想将选定的元素从dropdownList设置为此模型。但在Create方法的结果,我有一个null musicStyles,并且ModelState.isValid == false

+0

尝试添加'@ Html.ValidationSummary(假)'在你看来,看你递交表格后得到的错误消息。 – ekad

+0

@ekad我没有消息 – Ales

+0

阅读此:http://stackoverflow.com/a/1791664/1905949 – ekad

回答

3

一个<select>只回发一个价值 - 它不能绑定到财产List<MusicStyle> musicStyles您需要使用性能视图模型可以绑定到

public class BandVM 
{ 
    [Display(Name = "Music style")] 
    [Required(ErrorMessage = "Please select a style")] 
    public string SelectedMusicStyle { get; set; } 
    public SelectList MusicStyleList { get; set; } 
    .... 
} 

并且在控制器

public ActionResult Create() 
{ 
    BandVM model = new BandVM(); 
    model.MusicStyleList = new SelectList(db.MusicStyles); 
    return View(model); 
} 

,并在视图

@Html.LabelFor(m => m.SelectedMusicStyle) 
@Html.DropDownListFor(m => m.SelectedMusicStyle, Model.MusicStyleList, "select style") 
@Html.ValidationMessageFor(m => m.SelectedMusicStyle) 

在POST方法

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(BandVM model) // NO Bind.Include! 
{ 
    // model.SelectedMusicStyle will contain the selected value 
    // Create a new instance of the data model and map the view model properties to it 
    // Save and redirect 
} 
相关问题