2013-05-07 35 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