我已经删除了一个较旧的项目(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
答案 0 :(得分:1)
Selected
上SelectListItem
为真的事实无关紧要。当Razor呈现下拉列表时,它会根据ModelState
设置所选值,因此如果未选择正确的值,则表示ModelState
中不存在正确的值。
ModelState
由Request
,ViewData
/ 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;
但是,由于Request
和ViewData
/ ViewBag
中的值实际上优先,因此您需要确保不会以这种方式传递错误的值。例如,如果您有一个类似?cashType=foo
的查询字符串,那么所选的值将是&#34; foo&#34;,而不是您最初在模型上拥有的任何值。您还应该避免设置ViewBag.CashType
之类的内容。同样重要的是要注意,在所有这些情况下,命名都是不区分大小写的。说到ModelState
,foo == FOO == Foo == fOO。