2013-05-07 64 views
0

模型DropDownListFor給空總是

public class Cidade 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Nome { get; set; } 
} 

public class Usuario 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public Cidade Cidade { get; set; } 

    /* more fields... */ 
} 

控制器

public ActionResult Registrar() 
{ 
    using (var db = new MyContext()) 
    { 
     ViewBag.Cidades = new SelectList(db.Cidades.ToList(), "Id", "Nome"); 
    } 
    return View(); 
} 

[HttpPost] 
public ActionResult Registrar(Usuario usuario) 
{ 
    if (ModelState.IsValid) 
    { 
     using (var db = new MyContext()) 
     { 
      db.Usuarios.Add(usuario); 
      db.SaveChanges(); 
     } 

     return RedirectToAction("Index", "Home"); 
    } 

    return Registrar(); 
} 

查看

@Html.LabelFor(m => m.Cidade) 
@Html.DropDownListFor(m => m.Cidade, (SelectList)ViewBag.Cidades) 

ModelState.IsValid == false始終,因爲usuario.Cidade == null

:(

回答

1

綁定到模型的屬性,而不是模型本身。因此,不是這樣

@Html.DropDownListFor(m => m.Cidade, (SelectList)ViewBag.Cidades) 

,你需要做到這一點

@Html.DropDownListFor(m => m.Cidade.Id, (SelectList)ViewBag.Cidades) 

但會完全是因爲你有名稱的必需屬性可能不會解決你的問題。但是,你用你的模型也沒有你期望在視圖中使用它的方式方法。所以問題喲ü應該問自己的是:你創建沿CidadeUsuario在你的看法?我認爲的答案是「不」。我瞭解根據您的問題,您的設置方式是,你要一個Cidade分配給Usuario正在創建/編輯。

這又是另一種情況下,你會使用的ViewModels,這是一個標準的做法,escpecially對於這種事情。如果你不想使用viewomdel那麼你至少應該改變你的Usuario成這樣:

public class Usuario 
{ 
    [Key] 
    public int Id { get; set; } 

    public Cidade Cidade { get; set; } 

    [Required] 
    public int CidadeId { get; set; } 
} 

注意附加CidadeId並根據需要將其標記。在你看來,你會那麼做:

@Html.DropDownListFor(m => m.CidadeId, (SelectList)ViewBag.Cidades) 

UPDATE:

唯一不方便的就是要看到 「CIDADE」 爲空時 調試。很高興看到它充滿。

這真的是沒有必要的,真的不是一個好方法。但是,如果你真的覺得它適合你的項目,它仍然可以完成。所以你添加一個隱藏字段,將映射到Cidade.Nome

@Html.HiddenFor(m => m.Cidade.Nome) 
// then change your binding again to this 
@Html.DropDownListFor(m => m.Cidade.Id, (SelectList)ViewBag.Cidades) 

添加腳本來填充字段時,下拉的變化:

$("#Cidade_Id").change(function(){ 
    $("#Cidade_Name").val($(this).text()); 
}); 
+0

非常準確的,謝謝。 – Fabricio 2013-05-07 01:01:49

+1

不客氣。 – 2013-05-07 01:05:42

+0

唯一不方便的就是要看到「CIDADE」爲空調試時。 :)會很高興看到它充滿。 – Fabricio 2013-05-07 01:10:46