【问题标题】:Asp net MVC 5 and listbox with linqAsp net MVC 5 和带有 linq 的列表框
【发布时间】:2014-12-13 00:25:50
【问题描述】:

在阅读了有关如何使用 linq 填充列表框的几天后,我完全不知道我必须做些什么才能完成这项工作。我知道我必须有一个视图模型或类似的东西,但由于我不能在同一个视图中引用 2 个模型,所以我不知道该怎么做。

这是我的模型

public class ABC
{
    public int a { get; set; }
    public int b { get; set; }
    public int c { get; set; }
    public string d { get; set; }
    public string Type { get; set; }
    public int ID { get; set; }

    public class  ABCDBContext : DbContext
    {
        public DbSet<ABC> ABCs { get; set; }
    }
}

public class ABCModel
{
    public string type{ set; get; }
    public List<ABC> ABCs { set; get; }
}

控制器我知道我遗漏了很多东西,但我不知道如何使用该 linq 查询填充列表,也不知道如何在不使用 beginform 的情况下从视图中调用此控制器(我将有超过 1 个列表框这种形式)

public ActionResult GetStuff()
    {

       var Types = from m in db.ABCs
                   select m.Type.Distinct();

        return View(Types); 
    }

然后在我看来,我必须拥有 @model IEnumerable 所以我可以在该页面上显示表 abc 的所有内容。

那么,我可以创建一个填充 lsitbox 的视图模型吗(我需要用 abc 具有的参数填充至少 6 个,以便用户可以使用这些值搜索 abcs,但我想如果我能理解如何做 1 我可以为 6) 做我想要的并且允许我显示 abc 的条目吗?

这就是观点(我知道它有很多问题,但它只是举个例子)

@using (Html.BeginForm("getSelectedValues", "ABC", FormMethod.Get))
{
    Type:@Html.DropDownList() 

    a:@Html.DropDownList()

    b:@Html.DropDownList()

    //and so on

    <input type="submit" value="Filter" />
}

请原谅我对我错过的任何方面的无知,但我是 asp net mvc 5 的新手,如果有人可以指导我或向我发送关于我必须做什么的指南,我将不胜感激。

【问题讨论】:

  • 您应该使用视图模型来表示您想要显示和编辑的内容,但不清楚您实际编辑的是什么以及您想要显示下拉列表的哪些属性?

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


【解决方案1】:

我建议您创建一个名为 MYPAGENAMEViewModel.cs 的 ViewModel,然后在该 ViewModel 中您拥有 view.cshtml 文件所需的所有“模型”/数据......即类似于以下内容:

public class MYPAGENAMEViewModel
{
    public List<Types> MyTypes { get; set; }
    public List<OtherTypes> MyOtherTypes { get; set; }
}

然后在你的行动中。

public ActionResult GetStuff()
{
   MYPAGENAMEViewModel myViewModel = new MYPAGENAMEViewModel();

   myViewModel.MyTypes = from m in db.ABCs
                       select m.Type.Distinct();

   myViewModel.MyOtherTypes = from m in db.CBAs
                              select m.Type.Distinct();

   return View(myViewModel); 
}

然后在您的视图顶部:

@model MYPAGENAMEViewModel

然后在视图中:

MyTypes<br />
@Html.DropDownListFor(model => model.MyTypes.TypeId, (SelectList)model.MyTypes.TypeName) 

MyOtherTypes<br />
@Html.DropDownListFor(model => model.MyOtherTypes.TypeId, (SelectList)model.MyOtherTypes.TypeName) 

【讨论】:

  • 我收到“无法将类型 System.Linq.IQueryable> 隐式转换为 'project.Models.ViewModel”。我尝试了一些转换,但似乎都没有。无论如何,视图中有模型 ViewModel 和模型 ABC 吗?
  • @Donvan 您要转换什么信息? IEnumerable 永远不会直接进入 ViewModel,IQueryable 也意味着您实际上是在尝试将查询本身放入视图模型中(查看延迟加载以更好地理解该部分),首先使用某些东西执行查询像 .ToList()... 你可以在 HttpContext.Session 中显式传递 ABC,但你应该将 ABC 作为 ViewModel 的属性传递。
  • 感谢您的信息!我设法实现了我所需要的:)
【解决方案2】:

我不完全确定你在追求什么,但这可能是解决方案。

首先,您将创建一个 ViewModel,例如:

public class MyViewModel
{
 List<ABC> abcs { get; set; } // Your database values that you're going to loop through
 List<WhateverALookupShouldBe> aDropDownValues { get; set; }
 List<WhateverBLookupShouldBe> bDropDownValues { get; set; }
 // etc
 }

在您的数据或控制器中填充这些值。

如果您正在循环浏览列表并提交值,您将需要一个编辑器,因此请在您的视图文件夹下创建一个名为“EditorTemplates”的文件夹。然后添加一个与您的模型同名的 cshtml 文件,例如ABC。

在您的主视图中,您将拥有:

@model MyViewModel

@Html.EditorFor(model => model.abcs)

现在在您的 ABC 编辑器模板中,您可以为下拉列表编写如下内容:

@model ABC

@Html.DropDownListFor(model => model.a, new SelectList(Model.aDropDownValues, "DataValueFieldName", "DataTextFieldName"));

当您将其提交回来时,您应该会将数据返回给您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2016-12-16
    • 2019-02-17
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多