繁体   English   中英

与Html.DropDownListFor的值绑定错误

[英]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" }
 )

该代码有效,但是将连续步骤的基本步骤模型连续转换为具体类只能得到该值:

  1. 有点不舒服
  2. 使代码的可读性降低。

我想做什么?

我以为可以为每个步骤创建一个别名:

@{
    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM