0

楷模

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

:(

4

1 回答 1

1

您绑定到模型的属性而不是模型本身。所以而不是这样做

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

你需要这样做

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

但这可能不会完全解决您的问题,因为您有 name 的必需属性。但是,您使用模型的方式也不是您希望在视图中使用它的方式。所以你应该问自己的问题是:在你看来,你是否在创造一个Cidade和你一样的东西Usuario?我认为的答案是“不”。我根据您的问题理解您的设置的方式是您希望将 a 分配给CidadeUsuario正在创建/编辑的 a 。

这又是另一种使用视图模型的情况,这是一种标准做法,尤其是对于这类事情。如果您不想使用 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)

更新:

唯一不方便的是调试时必须将“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());
});
于 2013-05-07T00:50:04.583 回答