C# 使用Html.DropDownListFor绑定错误的值

C# 使用Html.DropDownListFor绑定错误的值,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,问题描述 我目前正在ASP.NET MVC应用程序中开发向导机制。然而,我在视图中绑定模型时遇到了一个问题。简言之: 我有一个向导模型,大致如下所示: class WizardViewModel { public IList<StepViewModel> Steps { get; set; } // ... } 代码可以工作,但将基本步骤模型连续浇铸到混凝土类中只能获得以下值: 不舒服, 使代码可读性降低 我想做什么? 我想我可以为每个步骤创建一个别名: @{

问题描述

我目前正在ASP.NET MVC应用程序中开发向导机制。然而,我在视图中绑定模型时遇到了一个问题。简言之:

我有一个向导模型,大致如下所示:

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" })