【问题标题】:DropDownListFor() does not select required item on get request (on post request works)DropDownListFor() 未在获取请求时选择所需项目(在发布请求时有效)
【发布时间】:2017-06-07 22:50:44
【问题描述】:

我清理了一个较旧的项目 (MVC 5.2.2),发现如果页面第一次作为响应呈现在 HttpGet 请求:生成的 HTML 代码根本不包含 selected 属性。

如果我检查视图模型,即 SelectList 项(在控制器中和呈现的视图中),则所需项的成员 Selected 设置为 true。项目的 Idenum 值。

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

而不是使用 enum 作为选定项目 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 来自 DB 模型:

[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>

有人知道我错过了什么吗?

谢谢,pf

【问题讨论】:

  • 在我的经验中选择的列表被忽略了。确保 CashType 的值等于你想要选择的值
  • CashType 值 ui 等于 item.Id 我不会选择。

标签: c# asp.net-mvc razor


【解决方案1】:

SelectedSelectListItem 上为真这一事实无关紧要。当 Razor 渲染下拉列表时,它会根据 ModelState 设置选择的值,因此如果没有选择正确的值,则意味着正确的值在 ModelState 中不存在。

ModelState 由来自RequestViewData/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 这样的查询字符串,那么选定的值将是“foo”,而不是您最初在模型上拥有的任何值。您还应该避免设置类似ViewBag.CashType 的内容。同样重要的是要注意,在所有这些情况下,命名都是不区分大小写的。说到ModelState,foo == FOO == Foo == fOO。

【讨论】:

  • 你是对的:与 HttpGet URL 的一部分同名的查询字符串是邪恶的。我必须将默认值传递给父模型/视图并将它们包含在查询字符串中以避免这种奇怪的行为:为什么渲染器不简单地渲染响应的模型并处理不应该是它的业务的输入值:-(无论如何,感谢您及时有用的答案。
猜你喜欢
  • 2022-01-04
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2018-11-28
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多