c# - 与 Html.DropDownListFor 的错误值绑定(bind)

标签 c# asp.net-mvc razor

问题描述

我目前正在研究 ASP.NET MVC 应用程序中的向导机制。但是,我在尝试在 View 中绑定(bind)模型时遇到了问题。简而言之:

我有一个向导模型,看起来或多或少是这样的:

class WizardViewModel {
    public IList<StepViewModel> Steps { get; set; }

    // ...
}

除最后一步外,每一步都有自己的模型。最后一步(摘要)采用整个 WizardStepModel 并且仅用于显示数据(通过禁用的控件)。显示所有步骤的值会在 View 中生成此类代码:

 @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。出于某种原因,下拉列表的值绑定(bind)不正确并显示第一个选项而不是所选选项。

问题

是否有另一种方法可以用来为向导中的步骤创建某种别名,这样我就不必在每次需要获取值时都执行强制转换?或者我做错了什么?如果有任何帮助,我将不胜感激。

最佳答案

由于您的“最后一步”只是一个摘要,并且可能用作保存到数据库之前的最后“确认步骤”,因此您不应该为您的属性生成禁用的表单控件。它会在任何地方呈现所需 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>

并使用类名来设置布局样式(结果无疑也会节省大量屏幕空间)。

对于下拉列表属性,您需要添加一个与所选文本关联的附加属性,因此除了 public int SelectedValue { get;放; } 在编辑 View 中使用,您将包含一个关联的 public string SelectedText { get;放; “最后一步” View 的属性。

从您的代码中还可以看出,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" })

关于c# - 与 Html.DropDownListFor 的错误值绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37434788/

相关文章:

javascript - 在部分 View 上加载脚本文件导致错误

c# - 枚举失败 == 当通过反射检索值时

asp.net-mvc - 如何停止 Elmah 日志记录?

asp.net - 如何配置 IIS 以使用自定义内容提供 404 响应?

c# - 从 cshtml 页面重定向

c# - 使用 MVC Razor View 发送电子邮件

c# - 避免由于延迟而在 SQL Server 中出现重复

c# - 内部类的公共(public)成员是什么意思?

c# - 在 C# 中使用扩展方法实现接口(interface)

javascript - 无法解释的 JavaScript 行为 - Bug?