16

好的,所以我是整个 MVC 世界的新手,但这似乎是一种完成工作的好方法,我正试图让它在这里工作。

问题是:我无法从我的 SQL 数据库中的表中获取数据到我的注册页面上的简单下拉表单中。

我只是不知道把东西放在哪里,在哪里编写代码来打开表格,选择 ID,放在哪里response.write以及如何将它发送到视图?

我的模型是这样的:

    public class users
{
    public string name {get; set;}
    public int user_id {get; set;}
}

我的控制器是这样的:

    [HttpGet]
    public ActionResult ListUser()
    {
        return View();
    }

我的观点是这样的:

@model Community.Models.users

我已经用谷歌搜索了 2 天,并在 youtube 上观看了几个视频,但没有用,我找不到。请问这里有了解的人吗?请给我一些好的教程和/或论坛,我可以在其中浏览我可能遇到的更多问题


这个项目仍然没有运气..

我正在创建一个表单,在该表单中,我想要一个 db-loop ( IEnumerable) .. 但当前模型不是IEnumerable. 我几乎被卡住了,看了一堆教程,他们都只列出一个连接,如果我想要两个模型怎么办?

这是我的控制器,我知道您必须将列表传递给视图,对吗?

    public ActionResult Registration()
    {
        return View(db.users.ToList());
    }

在没有模型的情况下,如何在我的视图中获取该列表IEnumerable

@neoistheone,你的例子对我帮助不大,我的数据库是这样打开的:

private DataBaseContext db = new DataBaseContext();

我不知道怎么做,但它打开了连接。我已经尝试了这么多小时了,太傻了,太久没睡了!

我习惯于编程 ASP-Classic 仅供参考,这是我第一次认真尝试升级我关于编程最新语言和 OOP 的知识。

4

7 回答 7

22

添加SelectList到您的模型:

public SelectList DropDownList { get; set; }

为该集合构建类:

public class MyListTable
{
    public string Key { get; set; }
    public string Display { get; set; }
}

然后在您的控制器中,MyListTable从数据库中加载该类的数据:

var list = new List<MyListTable>();

using (SqlConnection c = new SqlConnection(cString))
using (SqlCommand cmd = new SqlCommand("SELECT KeyField, DisplayField FROM Table", c))
{
    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            list.Add(new MyListTable
            {
                Key = rdr.GetString(0),
                Display = rdr.GetString(1)
            });
        }
    }
}

var model = new users();
model.DropDownList = new SelectList(list, "Key", "Display");

最后,您需要将模型发送到视图:

return View(model);

现在在 Razor 中你可以显示这个:

@Html.DropDownListFor(m => Model.DropDownList);

你当然可以为这些东西命名更好的名字,但你明白了。

于 2013-09-04T12:34:26.000 回答
9

已经有一个很好的答案,但这是另一种方法。

您将user用作模型、ListUserViewModel视图模型和UserController控制器。view-model 的工作是从控制器携带所有需要在页面上显示的信息,而不向模型类添加不需要的属性。在您的情况下,将数据库中的用户列表放入下拉列表中。

模型:

public class User     //By the way use singular when naming a class
{
    public string name {get; set;}
    public int user_id {get; set;}
}

视图模型

public class ListUserViewModel
{
    public list<User> Users{get; set;}
}

控制器

public class UserController : Controller
{
    private DataBaseContext db = new DataBaseContext();

    [HttpGet]
    public ActionResult ListUser()
    {
        var users = db.Users.ToList();

        var viewModel = new ListUserViewModel { Users = users };

        return View(viewModel);
    }
}

现在在您的视图中使用 ListUserViewModel 而不是 User 作为模型

@model Community.Models.ListUserViewModel

和下拉

@Html.DropDownListFor(m => m.Users, new SelectList(Model.Users, "user_id", "name"), " ")

解释:

Model.Users您正在使用选择列表数据源为用户创建下拉列表。"user_id"作为所选用户的值和"name"显示标签。最后一个参数(我放空字符串" ")是下拉菜单在选择之前显示的默认值。

我希望这会对您或其他人有所帮助。

于 2016-10-16T20:19:23.313 回答
6

尝试这个,

模型

public string CoutryID { get; set; }
public List<SelectListItem> CountryList { get; set; }

填充列表的控制器方法

public List<Country> getCountryList()
        {
            using (QRMG_VendorPortalDataContext _context = new QRMG_VendorPortalDataContext())
            {
                return (from c in _context.Countries
                        where c.IsDeleted == false
                        select c).ToList();
            }
        }

视图中的下拉列表

 @Html.DropDownListFor(m => m.CoutryID,
         new SelectList(Model.CountryList,
                        "CoutryID", "Value"))
于 2013-09-04T12:39:06.283 回答
5

我发现这个系统有效(并且避免使用 ViewBag):

查看型号:

public class YourViewModel
{
    // This could be string, int or Guid depending on what you need as the value
    public int YourDropdownSelectedValue { get; set; }
    public IEnumerable<SelectListItem> YourDropdownList { get; set; }
}

控制器:

// Get database values (by whatever selection method is appropriate)
var dbValues = db.YourEntity.ToList();

// Make Selectlist, which is IEnumerable<SelectListItem>
var yourDropdownList = new SelectList(dbValues.Select(item => new SelectListItem
{
    Text = item.YourSelectedDbText,
    Value = item.YourSelectedDbValue
}).ToList(), "Value", "Text");

// Assign the Selectlist to the View Model   
var viewModel = new YourViewModel(){
    // Optional: if you want a pre-selected value - remove this for no pre-selected value
    YourDropdownSelectedValue = dbValues.FirstOrDefault(),
    // The Dropdownlist values
    YourDropdownList = yourDropdownList
};

// return View with View Model
return View(viewModel);

在视图中:

@Html.DropDownListFor(a => a.YourDropdownSelectedValue, Model.YourDropdownList, "select this text - change this to null to exclude", new { @class = "your-class" })
于 2017-01-23T09:02:35.687 回答
3

如果您真的是 ASP.Net MVC 的新手,那么这是一个很好的教程,它向您展示了 MVC 模式的工作原理。

MVC3:http
://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/intro-to-aspnet-mvc-3 MVC4:http ://www.asp.net/mvc /tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

这是要下载的示例代码:http: //code.msdn.microsoft.com/Introduction-to-MVC-3-10d1b098

这是一个有用的视频:http ://www.asp.net/mvc/videos/mvc-1/conference-presentations/creating-nerddinnercom-with-microsoft-aspnet-model-view-controller-mvc

于 2013-09-04T12:43:15.727 回答
2

这是我在数据库中的表

在此处输入图像描述

看看我的动作控制器

    // GET: Letters
    public ActionResult Index()
    {
        ViewBag.LetterStatus = new SelectList(LetterStatusService.GetAllLettersStatus(), "Id", (CultureHelper.GetCurrentCulture() == "ar") ? "NameArabic" : "Name", Request.QueryString["LetterStatus"]);
        return View();
    }

并且在视图中

  @Html.DropDownList("LetterStatus")

我使用的构造函数是

new SelectList(
    list<Objlect> myListFromDatabase,
    string PropertyNameOfValueInHtml,
    string PropertyNameOfDesplayInHtml,
    string SelectedItemValue 
);

这条线Request.QueryString["LetterStatus"]是因为我在里面发送了选定的项目QuerySrting

并根据CurrentCulture我选择要显示的列

结果是在此处输入图像描述

但我认为最好的方法是获取或创建项目,然后迭代抛出它们以手动生成选择标签。我在这个答案中很好地描述了这种方法

希望这对你有帮助

于 2016-08-21T08:25:55.450 回答
0

我不得不将大约 5 个不同的 Stack Overflow 条目中的所有内容放在一起。我是一个不爱EF的新手。我更喜欢用 SQL 做事。Mike Perrenoud 让我开始了,但我很难让他的解决方案在视图中正确编译。

首先,我在模型中声明了我的下拉 Id/Name,然后声明了一个数字选择器和一个 SelectList

        public class BusinessType
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public int SelectedBusinessId { get; set; }
    public SelectList BusinessTypeddList { get; set; }

在我的 [HttpGet](没有传入模型的那个)中,我总是填充我的下拉列表。我在 SQL Server 中做事是因为我发现它比 EF 抽象和语法更容易(这让我感到困惑)。此代码声明了一个业务类型列表并直接从数据库中填充它。随意使用 sproc 或其他任何东西。重要提示:不要忘记在最后返回 View(model),否则您的 View 将收到 object missing reference 错误。

            var list = new List<MerchantDetail.BusinessType>();

        using (var con = new SqlConnection(Common.DB_CONNECTION_STRING_BOARDING))
        {
            con.Open();
            using (var command = new SqlCommand("SELECT Id, BusinessTypeDesc as Name FROM BusinessType order by Id", con))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        list.Add(new MerchantDetail.BusinessType
                        {
                            Id = reader.GetInt32(0),
                            Name = reader.GetString(1)
                        });
                    }
                }
            }
        }

        var model = new MerchantDetail();
        model.BusinessTypeddList = new SelectList(list, "Id", "Name");
        model.SelectedBusinessId = 0;

        return View(model);

观点很简单。我的看起来像这样。

@Html.DropDownListFor(m => m.SelectedBusinessId, Model.BusinessTypeddList, "Select One:", new { @class = "custom-select" });

注意:仅当模型中没有任何内容时,将 SelectedBusinessId 设置为 0 才有效。否则它将设置为下拉值之一。这将在传递模型的不同 HttpGet 中发生。

于 2021-09-24T17:40:42.753 回答