2011-12-03 34 views
3

我希望在我的视图中有一个显示患者ID,名字和姓氏的下拉列表。使用下面的代码,它会显示每个患者的名字。我如何将所有三个属性都传递到viewbag中并让它们显示在下拉列表中?MVC3下拉列表,显示每个项目的多个属性

控制器

public ActionResult Create() 
      {ViewBag.Patient_ID = new SelectList(db.Patients, "Patient_ID", "First_Name"); 
      return View(); 
      } 

查看

<div class="editor-field"> 
       @Html.DropDownList("Patient_ID", String.Empty) 
       @Html.ValidationMessageFor(model => model.Patient_ID) 
      </div> 

感谢。

好的,我编辑了我的代码,如下所示,并且收到错误消息“没有ViewData项的类型为”IEnumerable“,其中包含”SelectedPatientId“键。

Controller 


    public ActionResult Create() 
      { 
       var model = new MyViewModel(); 

     { 
      var Patients = db.Patients.ToList().Select(p => new SelectListItem 
      { 
       Value = p.Patient_ID.ToString(), 
       Text = string.Format("{0}-{1}-{2}", p.Patient_ID, p.First_Name, p.Last_Name) 
      }); 

      var Prescribers = db.Prescribers.ToList().Select(p => new SelectListItem 
    { 
     Value = p.DEA_Number.ToString(), 
     Text = string.Format("{0}-{1}-{2}", p.DEA_Number, p.First_Name, p.Last_Name) 
    }); 

      var Drugs = db.Drugs.ToList().Select(p => new SelectListItem 
      { 
       Value = p.NDC.ToString(), 
       Text = string.Format("{0}-{1}-{2}", p.NDC, p.Name, p.Price) 
      }); 


     }; 
       return View(model); 
      } 

视图模型

public class MyViewModel 
     { 
      [Required] 
      public int? SelectedPatientId { get; set; } 
      public IEnumerable<SelectListItem> Patients { get; set; } 

      [Required] 
      public int? SelectedPrescriber { get; set; } 
      public IEnumerable<SelectListItem> Prescribers { get; set; } 

      [Required] 
      public int? SelectedDrug { get; set; } 
      public IEnumerable<SelectListItem> Drugs { get; set; } 
     } 

查看

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    @Html.DropDownListFor(
     x => x.SelectedPatientId, 
     Model.Patients, 
     "-- Select patient ---" 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedPatientId) 
    <button type="submit">OK</button> 

     @Html.DropDownListFor(
     x => x.SelectedPrescriber, 
     Model.Patients, 
     "-- Select prescriber ---" 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedPrescriber) 
    <button type="submit">OK</button> 
} 
+0

Tha吨错误通常意味着您的项目列表为空 –

回答

1

我建议你不要使用在所有的任何ViewBag和定义视图模式:

public class MyViewModel 
{ 
    [Required] 
    public int? SelectedPatientId { get; set; } 
    public IEnumerable<SelectListItem> Patients { get; set; } 
} 

,然后让你的控制器动作填充,并通过这个视图模型到视图:

public ActionResult Create() 
{ 
    var model = new MyViewModel 
    { 
     Patients = db.Patients.ToList().Select(p => new SelectListItem 
     { 
      Value = p.Patient_ID.ToString(), 
      Text = string.Format("{0}-{1}-{2}", p.Patient_ID, p.First_Name, p.Last_Name) 
     }); 
    }; 
    return View(model); 
} 
在强类型视图

,最后显示的下拉列表:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(
     x => x.SelectedPatientId, 
     Model.Patients, 
     "-- Select patient ---" 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedPatientId) 
    <button type="submit">OK</button> 
} 
+0

我不相信我可以使用这种方法。除了包含患者姓名列表的DropDownList之外,我还有其他包含来自其他实体的数据的下拉列表。我的创建视图是Models.Rx的强类型。 Rx包含Patient,Prescriber和Drug之间的关系。如果我遵循你的方法,我将无法拉入任何不在“MyViewModel”内的东西,这是否正确? – HendPro12

+0

我编辑了我的代码并粘贴在上面。 – HendPro12

+0

@DanielHendrix,在更新的示例中,您已正确添加了另一个字段来保存预订者下拉列表。然后在创建视图中实例化这个视图模型('var model = new MyViewModel()'),然后查询数据库或其他内容,并将结果存储在某些局部变量中,例如患者,处方药和药物,但从未设置您的视图模型的属性。你需要设置他们'model.Patients =患者; ......在返回视图之前。 –

1

简单的方法来实现这一目标只是通过修改模型类或添加/修改部分类来创建模型的其他属性

[NotMapped] 
public string DisplayFormat 
{ 
    get 
    { 
     return string.Format("{0}-{1}-{2}", Patient_ID, First_Name, Last_Name); 
    } 
} 
+0

修改模型时,我收到以下错误。我使用了数据库优先方法。错误错误3004:映射从第561行开始的片段问题:没有为属性Patient.DisplayList在Set Patients中指定映射。 具有密钥(PK)的实体在以下情况下不会往返: 实体类型为[CAHODModel.Patient] – HendPro12

+0

对,您应该为该参数添加前缀[NotMapped]我更新了我的示例。请查看http://msdn.microsoft.com/en-us/data/gg193958 – torm

相关问题