我试图从编辑视图中将下拉列表的选定值提供给控制器。我一直得到同样的错误" {"价值不能为空。\ 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;
路线配置
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 }
);
}
}
答案 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列表。