检索MVC中的下拉列表值

时间:2016-12-19 19:09:30

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

我试图从编辑视图中将下拉列表的选定值提供给控制器。我一直得到同样的错误" {"价值不能为空。\ r \ n参数名称:商品"}"

以下是我的观点:

<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);
}

返回的错误是

  

&#34; {&#34;值不能为空。\ r \ n参数名称:项目&#34;}&#34;

为什么adminID不能保存/绑定的任何想法? enter image description here

路线配置

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 }
        );
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为,由于您将下拉列表命名为&#34; admin&#34;,当它回发时,MVC并不知道在哪里坚持该值,因为您没有&#39; t在post方法的参数中有一个名为admin的值。

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

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

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