[英]Wrong value binding with Html.DropDownListFor
问题描述
我目前正在ASP.NET MVC应用程序中使用向导机制。 但是,在尝试绑定视图中的模型时遇到了一个问题。 简而言之:
我有一个向导模型,看起来或多或少像这样:
class WizardViewModel {
public IList<StepViewModel> Steps { get; set; }
// ...
}
除了最后一步,每个步骤都有自己的模型。 最后一步(摘要)采用整个WizardStepModel
,仅用于显示数据(通过禁用的控件)。 在所有步骤中显示值都会在视图中导致这种代码:
@Html.DropDownListFor(
m => ((ConcreteStepModel)Model.Steps[0]).SelectedValue,
((ConcreteStepModel)Model.Steps[0]).SelectList,
new { disabled = "disabled" }
)
该代码有效,但是将连续步骤的基本步骤模型连续转换为具体类只能得到该值:
我想做什么?
我以为可以为每个步骤创建一个别名:
@{
ConcreteStepModel stepOne = (ConcreteStepModel)Model.Steps[0];
}
接着:
@Html.DropDownListFor(
m => stepOne.SelectedValue, stepOne.SelectList, new { disabled = "disabled" }
)
它适用于大多数控件,但不适用于DropDownList。 由于某些原因,下拉菜单的值绑定不正确,并显示第一个选项而不是所选的选项。
题
我是否可以使用另一种方法为向导的步骤创建某种别名,以使我不必在每次需要获取值时都进行强制转换? 还是我做错了什么? 我将不胜感激。
由于您的“最后一步”只是摘要,并且大概在保存到数据库之前被用作最后的“确认步骤”,因此您不应为属性生成禁用的表单控件。 它将在2到5倍于html的任何位置呈现,这只会降低性能。
而是仅将属性的值生成为文本,例如
<div class="field">
<div class="field-label">@Html.DisplayNameFor(m => m.Steps[0].SomeProperty)</div>
<div class="field-value">@Html.DisplayFor(m => m.Steps[0].SomeProperty)</div>
</div>
并使用类名称来设置布局样式(结果无疑也将节省大量屏幕空间)。
对于dropdownlist属性,您需要添加与所选文本关联的其他属性,因此除了public int SelectedValue { get; set; }
public int SelectedValue { get; set; }
public int SelectedValue { get; set; }
在编辑视图中使用,您将包括一个关联的public string SelectedText { get; set; }
public string SelectedText { get; set; }
public string SelectedText { get; set; }
属性的“最终步骤”视图。
从您的代码中还可以看出, StepViewModel
是一个抽象基类,并且每个“步骤”都有一个具体的类。 如果是这种情况,那么WizardViewModel
最好包含每个步骤的属性
public class WizardViewModel
{
public Step1Model Step1 { get; set; }
public Step2Model Step2 { get; set; }
....
}
这意味着如果您确实想生成表单控件,则无需强制转换类型。 该代码将是
@Html.DropDownListFor(m => m.Step1.SelectedValue, Model.Step1.SelectList, new { disabled = "disabled" })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.