【问题标题】:DropDownList is not passing any valuesDropDownList 没有传递任何值
【发布时间】:2018-06-02 04:49:14
【问题描述】:

为通过 linq 调用的美国各州创建动态下拉菜单。当我选择一个状态然后单击提交时,我浏览了代码,它显示我正在传递null。该列表应按原样显示,任何指导都会有所帮助。

如果您需要更多信息,请告诉我并发布。

控制器

 // GET:
    [AllowAnonymous]
    public ActionResult DealerLogin()
    {

        var results = (from a in db1.States
                       where a.CountryID == 221
                       select new SelectListItem { Value = a.StateID.ToString() , Text = a.Name }).ToList();
    }

查看

@using (Html.BeginForm())
    {
@Html.AntiForgeryToken()

 <div class="form-horizontal">

<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        <div class="form-group">
            @Html.LabelFor(model => model.StateId, "States", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.StateId, Model.States.Items as List<SelectListItem>, "-- Select --", new { @class = "form-control" })
            </div>
        </div>
    <div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="Create" class="btn btn-default" />
    </div>
   </div>
  </div>

}

型号

 public class EditProfile2
  {
    public int StateId { get; set; }
    public SelectList States { get; set; }
   }

更新

好的,我已经更新了所有内容,所以它几乎与@Fran 的答案相匹配,似乎他遗漏了一些东西,但我让它工作了。我还接受了@Stephen Muecke 所说的并摆脱了验证。

【问题讨论】:

  • 尝试使用@Html.DropDownListFor() 而不是@Html.DropDownList() 这将允许您绑定到您的模型属性。或者更正传递给@Html.DropDownList() 的第一个参数以匹配模型中的有效属性(又名:“StateName”)。参考:stackoverflow.com/a/8223513/3384612
  • 使用new SelectList(...) 从第一个创建另一个相同的IEnumerable&lt;SelectListItem&gt; 是没有意义的!
  • 并且由于StatesIEnumerable&lt;SelectListItem&gt;,那么拥有@Html.ValidationMessageFor(m =&gt; m.States) 是没有意义的(你不能对SelectList 应用验证),因为你的@Html.LabelFor(m =&gt; m.States) 也是如此,因为你没有表单控件对于States

标签: linq tsql asp.net-mvc-5


【解决方案1】:

您似乎正在使用 MVC 将免费提供给您的所有内置内容。

试试这个

您可以使用属性来定义所需的内容并修改显示名称,而无需实际写入您的视图。

视图模型:

 public class EditProfile2
 {    
    [Required]
    [DisplayName("State")]
    public int StateId { get; set; }
    public SelectList States {get;set;}
 }

查看:只包括相关部分

由于我们在模型上使用了属性,因此我们不必在视图中提供文本。我们也可以使用 DropDownListFor 代替 DropDownList。并且还让这个声明添加“--Select State--”选项

<div class="form-group">
@Html.LabelFor(model => model.StateId, htmlAttributes: new { @class = "control-label col-md-2" })
  <div class="col-md-10">
    @Html.DropDownListFor(model.StateId, Model.States, "-- Select State --", new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.StateId, "", new { @class = "text-danger" })
  </div>
</div>

由于我们之前使用属性和内置框架元素,我们的操作方法可以瘦身。

控制器动作:

[AllowAnonymous]
public ActionResult DealerLogin()
{
   var results = (from a in db1.States
              where a.CountryID == 221
              select new SelectListItem { Value= a.StateID.ToString(), Text = a.Name }).ToList();


    return View(new EditProfile2 { States = new SelectList(results)});
}

【讨论】:

  • 好的,这更有意义,但是当我将事情更改为您拥有的方式时,我会遇到一些错误。在控制器中,您没有将结果设置为类型,而在 a.StateID 的 Linq 查询中,它说我无法将类型“int”隐式转换为“字符串”。然后对于视图方面,我得到一个'方法'的类型arg'......'无法从用法中推断出来。尝试明确指定类型 arg
  • a.StateID 更改为a.StateID.ToString() 解决了一个问题。
  • @whisk 是的。错过了控制器动作中的 var。更新答案
  • 如果我刷新/提交页面并返回我会收到System.NullReferenceException: 'Object reference not set to an instance of an object.' 错误,是否有原因?
  • @whisk 当您发帖时,您通常会重定向到某个索引页面。参见 PRG 模式。如果您的模型验证失败,您需要在返回视图之前重新加载列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2010-10-06
  • 2014-05-21
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多