DropDownListFor()没有在get请求中选择所需的项目(在发布请求工作时)

时间:2017-06-07 13:12:48

标签: c# asp.net-mvc razor

我已经删除了一个较旧的项目(MVC 5.2.2)并发现我的 DropDownListFor()用法中的一个如果第一次呈现为 HttpGet 请求:生成的HTML代码根本不包含所选属性。

如果我检查视图模型,即 SelectList 项目(在控制器中并在渲染视图中),则所需项目的成员 Selected 设置为true。商品的 ID 枚举值。

当同一页面呈现为对 HttpPost 请求的响应时,一切正常。最糟糕的是,在检查模型时,值与 HttpGet 请求相同,而 SelectLists 在两种情况下都创建了相同的例程...

而是使用枚举作为所选项目 Id 我尝试了一个完整项目的实例,如同answer here中所选的一样,结果相同:不起作用在 HttpGet

列表以这种方式构建:

  List<CashType> types;
  if (AIncludeAll)
    types = ADbContext.CashTypes.OrderBy(c => c.Ident).ToList();
  else
    types = ADbContext.CashTypes.Where(c => c.Id != CashTypeValues.All).OrderBy(c => c.Ident).ToList();
  //
  foreach (var type in types)
    type.Translation = CashTypeValueToDescription(type.Id);
  return new SelectList(types, "Id", "Translation", ACashType);

CashType来自数据库模型:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public CashTypeValues Id { get; set; }

[Required]
[StringLength(DBDomains.D_IDENTCODE)]
[Index(IsUnique = true)]
public string Ident { get; set; }

[NotMapped]
public string Translation { get; set; }

查看模型是

[Display(Name = "View_Unit_CashType", ResourceType = typeof(WebGui))]
public CashTypeValues CashType { get; set; }
public SelectList CashTypes { get; set; } 

最后,Razor的使用情况如下:

<div class="Theme-Bottom-Filter-Field">
  @Html.LabelFor(m => m.CashType)
  @Html.DropDownListFor(m => m.CashType, Model.CashTypes, new { Id = "CashTypeSelector" })
</div>

有人知道我缺少什么吗?

Thanx,pf

1 个答案:

答案 0 :(得分:1)

SelectedSelectListItem为真的事实无关紧要。当Razor呈现下拉列表时,它会根据ModelState设置所选值,因此如果未选择正确的值,则表示ModelState中不存在正确的值。

ModelStateRequestViewData / ViewBag和最后Model的值组成。通常,您只想确保您传递给视图的模型具有适当的值集。例如,如果希望视图模型上的属性具有默认值,则可以执行以下操作:

private CashTypeValues? cashType;
public CashTypeValues CashType
{
    get { return cashType ?? CashTypeValues.Default; }
    set { cashType = value; }
}

或者,在C#6 +中:

public CashTypeValues CashType { get; set; } = CashTypeValues.Default;

但是,由于RequestViewData / ViewBag中的值实际上优先,因此您需要确保不会以这种方式传递错误的值。例如,如果您有一个类似?cashType=foo的查询字符串,那么所选的值将是&#34; foo&#34;,而不是您最初在模型上拥有的任何值。您还应该避免设置ViewBag.CashType之类的内容。同样重要的是要注意,在所有这些情况下,命名都是不区分大小写的。说到ModelState,foo == FOO == Foo == fOO。