gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:50 24 4
gpt4 key购买 nike

问题描述

我目前正在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com