【问题标题】:Retrieving Dropdown List Value in MVC [duplicate]在 MVC 中检索下拉列表值 [重复]
【发布时间】:2016-12-19 19:09:30
【问题描述】:

我正在尝试将下拉列表的选定值从编辑视图获取到控制器。我不断收到相同的错误“{”Value cannot be null.\r\nParameter name: items“}”

这是我的看法:

<div class="form-group">
    @Html.LabelFor(model => model.adminID, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(model => model.adminID, new SelectList(ViewBag.Admins, "Value", "Text"), htmlAttributes: new { @class = "form-control", @name = "admin" })
        @Html.ValidationMessageFor(model => model.adminID, "", new { @class = "text-danger" })
    </div>
</div>

我在 get 操作中创建了 SelectList。

var admins = from a in db.members
                     select new { name = a.student.Fname + " " + a.student.Sname, id = a.StudentID };

ViewBag.Admins = admins.Select(a => new SelectListItem
{
    Text = a.name,
    Value = a.id
}).ToList();

这里是控制器。我使用了adminID,属性的名称来尝试绑定它,但是当我发布页面时它返回错误。

public async Task<ActionResult> Edit([Bind(Include = "ClubId,ClubName,CreationDate,adminID")] Club club)
{
    if (ModelState.IsValid)
    {
        db.Entry(club).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(club);
}

返回的错误是

"{"值不能为空。\r\n参数名称:items"}"

任何想法为什么 adminID 不会保存/绑定?

路由配置

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Clubs", action = "Index", id = UrlParameter.Optional }
        );
    }
}

【问题讨论】:

  • 你的路线是什么样的?
  • @JesseMoreland,不太清楚你的意思。
  • 显示异常行以及控制器动作定义plz
  • @Steve 控制器操作在最初的问题中(代码的第三个 sn-p)。屏幕截图中附有异常行,位于屏幕截图的顶部。
  • @RyanSpain 在 MVC 中,你有一个路由配置。我的猜测是那里的某个地方,你有一个路线问题。该路由需要一个名为 items 的参数。

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


【解决方案1】:

DropdownListFor 的名称必须与对象的属性同名,否则使用 FormCollection,从表单实例中获取值并赋值给属性

【讨论】:

    【解决方案2】:

    我认为,由于您将下拉列表命名为“admin”,因此当它回发时,MVC 不知道将值粘贴在哪里,因为您在 post 方法的参数中没有名为 admin 的值.

    如果您删除@name,它应该可以工作。

    @Html.DropDownListFor(model => model.adminID, new SelectList(ViewBag.Admins, "Value", "Text"), htmlAttributes: new { @class = "form-control" })
    

    另一件事,您正在控制器中创建一个新的选择列表,然后将其传递给视图数据,因此此时您在视图数据中有一个选择列表。然后在视图中,您要声明另一个选择列表,因此您有一个包含一个元素的 SelectList 的 SelectList。

    【讨论】:

    • 我实际上按照其他人的建议尝试了这个。它返回相同的错误。
    • 在答案中添加了更多内容。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2017-03-22
    相关资源
    最近更新 更多