C# 使用Html.DropDownListFor绑定错误的值
问题描述 我目前正在ASP.NET MVC应用程序中开发向导机制。然而,我在视图中绑定模型时遇到了一个问题。简言之: 我有一个向导模型,大致如下所示:C# 使用Html.DropDownListFor绑定错误的值,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,问题描述 我目前正在ASP.NET MVC应用程序中开发向导机制。然而,我在视图中绑定模型时遇到了一个问题。简言之: 我有一个向导模型,大致如下所示: class WizardViewModel { public IList<StepViewModel> Steps { get; set; } // ... } 代码可以工作,但将基本步骤模型连续浇铸到混凝土类中只能获得以下值: 不舒服, 使代码可读性降低 我想做什么? 我想我可以为每个步骤创建一个别名: @{
class WizardViewModel {
public IList<StepViewModel> Steps { get; set; }
// ...
}
代码可以工作,但将基本步骤模型连续浇铸到混凝土类中只能获得以下值:
@{
ConcreteStepModel stepOne = (ConcreteStepModel)Model.Steps[0];
}
然后:
@Html.DropDownListFor(
m => stepOne.SelectedValue, stepOne.SelectList, new { disabled = "disabled" }
)
它适用于大多数控件,但不适用于DropDownList。由于某些原因,下拉列表的值绑定不正确,并显示第一个选项,而不是所选选项
问题
是否有其他方法可以用于为向导中的步骤创建某种别名,这样我就不必每次需要获取值时都执行强制转换?或者我做错了什么?如果有任何帮助,我将不胜感激。因为您的“最后一步”只是一个摘要,可能是保存到数据库之前的最后一个“确认步骤”,所以您不应该为属性生成禁用的表单控件。它将在任何地方呈现所需html的2-5倍,这只会降低性能 例如,只需将属性的值生成为文本
<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>
这意味着,如果您确实希望生成表单控件,则无需强制转换该类型。代码就是
@Html.DropDownListFor(m => m.Step1.SelectedValue, Model.Step1.SelectList, new { disabled = "disabled" })
使用
@Html.DropDownListFor(m=>stepOne.SelectedValue,…)
生成
,您的模型没有名为stepOne
的复杂属性,该属性包含名为SeledctedValue
的属性,因此绑定失败。是的,我看到了。这对我来说似乎很奇怪,因为当我使用其他Html。[…]作为方法时,它是有效的。唯一不起作用的控件是DropDownList。这就是为什么我问了一个问题-我想知道是否有办法解决这个问题如果你使用m=>stepOne,它对任何其他控件都不起作用。anypropertyatal
:)好吧,你信不信由你,但它确实存在:-)也许它在controller中不会被正确绑定,但它不必,因为我正在会话中存储模型。我想做的是让它们显示在视图中——这适用于标签、文本框、单选按钮等。当然,它不会在控制器中正确绑定——因此它不起作用!但是,如果您不打算编辑/保存数据,那么创建表单控件有什么意义呢?谢谢您的回答。尽管需要进一步修改(我正在重构现有代码),但在这种情况下,显示值而不是使用禁用的控件的想法似乎是最好的。关于在WizardViewModel中存储具体步骤,我的重点是创建一个简单的通用机制,它可以在应用程序的许多向导中使用。这就是为什么我有一个包含步骤的列表,而不是包含具体步骤的属性。不过,稍微修改一下您的想法,我可以为每个向导创建一个具体的模型,并创建从列表中返回具体步骤的getter。
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" })