【问题标题】:Creating DropDownListFor Using To Tables使用 To 表创建 DropDownListFor
【发布时间】:2015-11-30 11:02:05
【问题描述】:

我在使用与实体代码相关的表之间的关系创建 DropDownListFor 时遇到问题:

public class Motivo_Agenda 
{
    [Key]
    [Required]      
    public string DESC_MOTIVO { get; set; }
}

public class Agenda // Agenda da produção
{
    [Key]
    public int ID_AGD { get; set; }
    [Required]       
    public DateTime DATA_AGD { get; set; }       
    [Display(Name = "De")]
    public TimeSpan DE { get; set; }
    [Required]
    [Display(Name = "Até")]
    public TimeSpan ATE { get; set; }
    [Required]       
    public virtual Motivo_Agenda MOTIVO_AGENDA { get; set; }
}

我正在尝试创建一个下拉列表以将新项目添加到议程表中,这是我的控制器:

bAxaltaModel dbAxalta = new dbAxaltaModel();
    // GET: Agenda
    public ActionResult Edit()
    {
        ViewBag.MOTIVO_AGENDA = new SelectList(dbAxalta.Motivos_Agenda, "DESC_MOTIVO", "DESC_MOTIVO");
        return View();
    }

    [HttpPost]
    public ActionResult Edit([Bind(Include = "DE,ATE,DATA_AGD,FLAG_SAB_DOM,MOTIVO_AGENDA")]Agenda Agendas)
    {

        var errors = ModelState.Values.SelectMany(v => v.Errors).ToList();
        if (ModelState.IsValid != false)
        {                
            dbAxalta.Agendas.Add(Agendas);
            dbAxalta.SaveChanges();
            var query = dbAxalta.Agendas.Where(m => m.DATA_AGD == Agendas.DATA_AGD);
            TempData["Agendas"] = query.ToList();
            return View();
        }
        ViewBag.MOTIVO_AGENDA = new SelectList(dbAxalta.Motivos_Agenda, "DESC_MOTIVO", "DESC_MOTIVO", Agendas.MOTIVO_AGENDA);
        return View();
    }

我的下拉菜单是这样的:

 @Html.DropDownListFor(m => m.MOTIVO_AGENDA, ViewBag.MOTIVO_AGENDA as SelectList, htmlAttributes: new { @class = "form-control" })

但我收到以下错误:

从类型“System.String”到类型“Axalta_Project.Models.Motivo_Agenda”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。

任何想法如何绑定这些?

【问题讨论】:

  • 为什么你在m => m.MOTIVO_AGENDA.这一行有一个dot(在MOTIVO_AGENDA之后)?
  • 这是一个错字。但在代码中它很好。谢谢你让我知道。
  • 您不能将<select> 元素绑定到复杂对象(<select> 只能回发单个值)。它必须是@Html.DropDownListFor(m => m.MOTIVO_AGENDA.DESC_MOTIVO, ViewBag.MOTIVO_AGENDA as SelectList, ... )。并更改 ViewBag 属性的名称,使其与您的模型属性之一不同。
  • 当我执行“m.MOTIVO_AGENDA.DESC_MOTIVO”时,它表示我正在尝试插入具有相同值的新“Motivo_Agenda”,因此我违反了主键。这是他试图在表中插入一个新值而不是创建一个新关系。
  • 那么您的 Agenda 模型需要一个导航属性(Motivo_Agenda 的 FK)并且您绑定到该属性。

标签: c# model-view-controller dropdownlistfor asp.net-mvc-helpers


【解决方案1】:

使用 DropDownListFor 时,第一个参数是选定的值,因此您需要将其添加到模型中。

理想情况下,使用类似于以下格式的 Model 类而不是 ViewBag:

 public class MyModel {
public int SelectedAgendaId {get; set;}
public SelectList Agendas {get;set;}
}

然后使用这样的东西:

@Html.DropDownListFor(m => m.SelectedAgendaId, Model.Agendas, htmlAttributes: new { @class = "form-control" })

【讨论】:

  • My View 是 Agenda 类型的强类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多