MVC 在 ModelState.IsValid = false 上设置 Html.DropdownList

2023-12-15

这是我一直困惑的问题,在保持代码可维护的同时,最好的方法是什么。下面的代码为支付网关表单设置了月份和年份的列表,然后将它们分配给类型的变量List<SelectListItem>.

初步行动

PayNowViewModel paymentGateway = new PayNowViewModel();
List<SelectListItem> paymentGatewayMonthsList = new List<SelectListItem>();
List<SelectListItem> paymentGatewayYearsList = new List<SelectListItem>();

for (int i = 1; i <= 12; i++)
{
    SelectListItem selectListItem = new SelectListItem();
    selectListItem.Value = i.ToString();
    selectListItem.Text = i.ToString("00");

    paymentGatewayMonthsList.Add(selectListItem);
}

int year = DateTime.Now.Year;
for (int i = year; i <= year + 10; i++)
{
    SelectListItem selectListItem = new SelectListItem();
    selectListItem.Value = i.ToString();
    selectListItem.Text = i.ToString("00");

    paymentGatewayYearsList.Add(selectListItem);
}

paymentGateway.ExpiryMonth = paymentGatewayMonthsList;
paymentGateway.ExpiryYear = paymentGatewayYearsList;

return View(paymentGateway);

这是相当多的代码,我发现自己以类似的格式重复此代码,以在 ModelState.IsValid 为 false 时重新设置下拉列表选项,并且我想返回到用户的视图以更正这些错误。

HttpPost 操作 - 代码

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ConfirmPayment(PayNowViewModel paymentGatewayForm, FormCollection form)
{
    if (ModelState.IsValid)
    {
        // Post processing actions...
        return View();
    }
    else
    {
        for (int i = 1; i <= 12; i++)
        {
            SelectListItem selectListItem = new SelectListItem();
            selectListItem.Value = i.ToString();
            selectListItem.Text = i.ToString("00");

            paymentGatewayMonthsList.Add(selectListItem);
        }

        int year = DateTime.Now.Year;
        for (int i = year; i <= year + 10; i++)
        {
            SelectListItem selectListItem = new SelectListItem();
            selectListItem.Value = i.ToString();
            selectListItem.Text = i.ToString("00");

            paymentGatewayYearsList.Add(selectListItem);
        }

        form.ExpiryMonth = paymentGatewayMonthsList;
        form.ExpiryYear = paymentGatewayYearsList;

        return View("MakePayment", form);
    }
}

集中此下拉设置代码使其仅位于一个位置的最佳方法是什么?目前你会看到很大一部分(for循环),正好重复了两次。具有功能的基本控制器?还是像上面那样重新设置更好?

任何建议表示赞赏! 麦克风。


将私有方法添加到您的控制器(以下代码假设您的ExpiryMonth and ExpiryYear属性是IEnumerable<SelectListItem>这就是全部DropDownListFor()方法要求)

private void ConfigureViewModel(PayNowViewModel model)
{
  model.ExpiryMonth = Enumerable.Range(1, 12).Select(m => new SelectListItem
  {
    Value = m.ToString(),
    Text = m.ToString("00")
  });
  model.ExpiryYear = Enumerable.Range(DateTime.Today.Year, 10).Select(y => new SelectListItem
  {
    Value = y.ToString(),
    Text = y.ToString("00")
  });
}

然后在 GET 方法中

public ActionResult ConfirmPayment()
{
  PayNowViewModel model = new PayNowViewModel();
  ConfigureViewModel(model);
  return View(model);
}

并在 POST 方法中

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ConfirmPayment(PayNowViewModel model)
{
  if (!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model);
  }
  .... // save and redirect (should not be returning the view here)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 在 ModelState.IsValid = false 上设置 Html.DropdownList 的相关文章

随机推荐

  • 未找到名为 os 的模块 - Django、mod_wsgi、Apache 2.2

    我正在尝试设置 apache mod wsgi 和 django 我的 apache 错误日志中出现了内部服务器错误 Wed Jun 22 21 31 55 2011 error client 1 mod wsgi pid 2893 Tar
  • 将 Json 文件内容保存到 python/pandas 中的 CSV 文件

    如何将 数据 信息放入最后所示的 csv 表中 以及正确的 标头 以便源服务器不会让我以为我正在抓取数据 到目前为止我写的代码如下 import requests json headers User Agent Mozilla 5 0 da
  • 令人困惑的宏和枚举定义

    我正在浏览一些 Route netlink 源代码 我想弄清楚 RTNLGRP NEIGH 的值是多少 Source http lxr free electrons com source include linux rtnetlink h
  • 使用 OpenGLES 抗锯齿去除绳索的锯齿状边缘

    我已经实现了绳索 其中我使用 Revolute 关节连接动态 b2bodied 现在我成功创建了这条绳索 但我的绳索看起来不光滑 我希望它们像丝带一样光滑 任何对此有想法的人 我发现它可以通过 openGLES 使用抗锯齿来实现 但仍然不知
  • PHP SimpleXML 大文件没有额外的内存使用

    在每一篇有关 SimpleXML 性能和内存使用的文章中 都会提到所有解析的内容都存储在内存中 处理大文件将导致大量的内存使用 但最近我发现使用 SimpleXML 处理大文件不会导致大量内存使用 甚至几乎不会导致内存使用 有我的测试脚本
  • 删除 Azure 资源组中年龄超过 x 天的所有资源

    我尝试在资源组 python api 中的资源上 扩展 creationTime 这样我就可以找到它的年龄 如果 gt max age days 我就会删除资源组中的资源 但creationTime似乎在资源上不可用 是否有另一种方法可以根
  • 用多种颜色为轴刻度文本着色

    我正在尝试绘制一个heatmap using R s plotly包 我希望为 y 轴刻度文本的特定标签设置特定的颜色 这是一个示例数据集 set seed 1 df lt reshape2 melt matrix rnorm 100 10
  • ASIO 示例代码在应该之前关闭套接字

    我需要一个使用 ASIO 的并行同步 TCP 解决方案 我正在尝试从这些示例中获取示例代码 https github com jvillasante asio network programming cookbook tree master
  • Java 中的检查异常与非检查异常

    我在理解之间的差异时遇到一些问题checked and uncheckedJava 中的异常 首先 checked异常应该在编译时查找异常 不同来源提供的示例引用了数据库连接 文件处理等其中一些 而unchecked异常应该查找程序员的错误
  • 如何在非 UWP C# 项目中访问 Windows.Gaming.Input?

    我见过一些在 C 控制台应用程序中使用 Windows Gaming Input 的示例 但是否也可以在非 UWP C 项目中访问它 Thanks 我已经通过执行以下操作成功做到了这一点 确保 VisualStudio 未运行 打开你的项目
  • Magento - 显示产品所属的类别

    我使用下面的代码在我的产品页面上显示产品所属的类别 但我经营相同产品的多商店 它还显示其他网站的类别 如何只显示我正在访问的网站的类别 a href a
  • Jquery load() 一个包含 JavaScript 的 html 文件

    我有一个很大的困境 我想加载一个 html文件包含 javascript google 地图 代码来渲染其中的 div maps html 看起来像这样
  • Rails Postgres 查询,仅选择出现在所有搜索参数中且具有关联的项目

    我正在寻找基于一些用户选择参数创建一个 Postgres 查询 用户将选择商店以及开始和结束年份 提交后 我只想显示仅存在于所选所有年份的商品的平均价格 例如 用户选择开始日期为 2014 年 结束日期为 2018 年 项目香蕉在所有这些年
  • 在Java中缩短字符串

    我需要将 ABC123 等 6 个字符的字符串缩短为唯一的 4 个字符的字符串 它必须是可重复的 以便输入字符串始终生成相同的输出字符串 有谁有任何理想如何做到这一点 不可能执行从 6 个字符的字符串到 4 个字符的字符串的完全唯一的映射
  • 如何在 C 中以十六进制字节格式打印浮点数?

    我想查看 IEEE754 格式表示形式的浮点值 3 14159265 于是写了这段测试代码 include
  • 计算给定日期范围内星期一的数量

    给定一个日期范围 我需要知道该范围内有多少个星期一 或星期二 星期三等 我目前正在使用 C 工作 尝试这个 static int CountDays DayOfWeek day DateTime start DateTime end Tim
  • 获取Python中内置函数的参数(arg)数量

    我为 Python 和文档中的自定义表编写了自己的 c 模块我需要运行时内置函数的参数数量 Python 2 中有类似的函数检查 getargspec或 Python 3 中的函数 例如检查签名它支持普通的 Python 函数 但不支持内置
  • 如何在 Internet Explorer 浏览器的 JavaScript 中修复数组 indexOf()

    如果您使用过 JavaScript 您就会知道 Internet Explorer 不会为 Array prototype indexOf 实现 ECMAScript 函数 包括 Internet Explorer 8 这不是一个大问题 因
  • 在 XAML 中绑定到 WPF DataGridCell 内容时出现问题

    我使用以下帖子来实现绑定到动态对象列表的数据网格 将 DynamicObject 绑定到 DataGrid 并自动生成列 ITypedList 方法 GetItemProperties 工作正常 显示一个网格 其中包含我描述的所有列 我使用
  • MVC 在 ModelState.IsValid = false 上设置 Html.DropdownList

    这是我一直困惑的问题 在保持代码可维护的同时 最好的方法是什么 下面的代码为支付网关表单设置了月份和年份的列表 然后将它们分配给类型的变量List