【问题标题】:MVC - Populate Two Dropdowns From Database in Partial View with ViewModelMVC - 使用 ViewModel 在部分视图中填充数据库中的两个下拉列表
【发布时间】:2015-05-30 15:29:29
【问题描述】:

这是我正在尝试做的视觉效果。

所以基本上这里发生的情况是,您从左侧的选择中选择一个名称,从右侧的选择中选择一个团队,然后单击提交分配并添加一条记录。 (此信息仅供参考,以便您了解上下文。我不需要数据库插入或更新方面的帮助。)

这将是一个带有 ViewModel 的 PartialView。

我需要知道如何使用单独的列表填充这两个下拉列表。我假设这些会出现在 ViewModel 中。

所以在我的主视图中,我使用 RenderAction 调用了 PartialView。

                    //The action       //The controller
@{Html.RenderAction("TeamAssignment", "TeamAssignment");}

被调用的控制器

public class TeamAssignmentController : Controller
    {
        MyDatabaseEntities db = new MyDatabaseEntities();

        [ChildActionOnly]
        public ActionResult TeamAssignment()
        {
            //NEED A VIEW MODEL HERE TO PASS INTO THE PARTIALVIEW
            return PartialView();
        }
}

在 ViewModel 中,我需要填充两个下拉列表的列表。

Name 左侧的 linq 查询是这样的。

var nameList = (from p in db.Participant
                where p.ParticipantType == "I"
                select new {
                    p.ParticipantID,
                    p.IndividualName
                }).ToList();

Team 右侧的 linq 查询是这样的。

var teamList = (from p in db.Participant
                where p.ParticipantType == "T"
                select new {
                    p.ParticipantID,
                    p.TeamName
                }).ToList();

如何将该信息传递到 PartialView 以及如何使用 ID 填充下拉列表以显示值和名称以显示文本?

更新

我相信这可能是我需要的 ViewModel。这是正确的吗?

public class TeamAssignmentViewModel
{
    //Need these ints for the updating and deleting
    public int IndividualParticipantID { get; set; }
    public int TeamParticipantID { get; set; }
    public List<Participant> NameList { get; set; }
    public List<Participant> TeamList { get; set; }
}

【问题讨论】:

  • 请显示您的视图。不太确定您要做什么,但我认为您应该使用 js 进行动态更新视图
  • 除了对局部视图的调用之外,视图中没有任何相关的内容。 @{Html.RenderAction("TeamAssignment", "TeamAssignment");}忽略更新的东西,我已经控制住了。我只需要知道如何将包含我的视图模型中下拉列表的两个对象从控制器发送到局部视图。
  • 你为什么不把模型传给你的PartialView
  • 也可以直接渲染局部视图。

标签: c# asp.net-mvc linq asp.net-mvc-partialview asp.net-mvc-viewmodel


【解决方案1】:

您需要创建一个视图模型的实例,填充它并将其传递给您的PartialView

    [ChildActionOnly]
    public ActionResult TeamAssignment()
    {
        // Instantiate A VIEW MODEL HERE TO PASS INTO THE PARTIALVIEW
        MyCustomModel model = new MyCustomModel();
        model.nameList = (from p in db.Participant
            where p.ParticipantType == "I"
            select p).ToList();
        model.teamList = (from p in db.Participant
            where p.ParticipantType == "T"
            select p).ToList();

        return PartialView("TeamAssignment", model);
    }

已编辑:删除了 linq 语句中动态类的使用

下拉菜单的标记可能类似于:

@Html.DropDownListFor(model => model.IndividualParticipantID,
new SelectList(Model.NameList, "ParticipantID", "FirstName")

@Html.DropDownListFor(model => model.IndividualParticipantID,
new SelectList(Model.TeamList, "ParticipantID", "Team")

【讨论】:

  • 虽然我怀疑这个示例会失败,因为您无法将匿名类型分配给自定义模型属性。但是当您更新到 IEnumerable 时,这应该是固定的。 msdn.microsoft.com/en-us/library/…
  • David,您能举例说明一下您是如何设置 MyCustomModel 的吗?它是否只包含两个列表属性,如public List&lt;Participant&gt; NameList { get; set; }public List&lt;Participant&gt; TeamList { get; set; }
  • @madvora 只是这两个属性(除非您在部分中需要更多属性)。
  • David,我用包含额外属性的提议 ViewModel 更新了我的帖子。不过,在控制器中的查询之后,我收到一个抱怨 ToList() 的错误。这是错误Cannot implicity convert type 'System.Collections.Generic.List&lt;AnonymousType#2&gt;' to System.Collections.Generic.List&lt;MyProject.Models.Participant&gt;'
  • 抱歉——我目前没有使用 IDE。您遇到的问题是每个查询中的select new。现在发布对我的代码的编辑。
【解决方案2】:

首先我承认我没有阅读所有发布的内容,但我可以帮助将数据传递给 PartialView 以用作模型。

在您的视图中,您可以像这样构建部分:

@Html.Partial("_PartialViewName", currentItem,
   new ViewDataDictionary { 
      { "ExtraValue", Model.Count },
      { "SecondExtraValue", @ViewBag.ValueToPass });

然后在PartialView中,你可以这样做:

@model [Type of currentItem from above]
@{
   // I'm using var here for shorthand, whereas I do strong typing and cast in my codebase.
   var dataValue = ViewData["ExtraValue"];
   var secondDataValue = ViewData["SecondExtraValue"];
 }

使用此方法,您可以传入模型以及渲染可能需要的其他值。

希望这会有所帮助。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多