当名称不匹配时 MVC UpdateModel

2024-01-02

假设您有一个看起来像这样的模型:

public class MyClass {
    public string Name { get; set; }
    public DateTime MyDate { get; set; }
}

Visual Studio 为您提供的默认编辑模板是一个纯文本框,用于MyDate财产。这一切都很好,但是假设您需要将其分成月/日/年组件,并且您的表单如下所示:

<label for="MyDate">Date:</label>
<%= Html.TextBox("MyDate-Month", Model.MyDate.Month) %>
<%= Html.TextBox("MyDate-Day", Model.MyDate.Day) %>
<%= Html.TextBox("MyDate-Year", Model.MyDate.Year) %>

提交后,会调用UpdateModel不起作用,因为没有定义MyDate-Month。有没有办法向项目添加自定义绑定器来处理此类情况,或者 HTML 输入的命名不同(无论出于何种原因)?

我发现的一种解决方法是在提交之前使用 JavaScript 将隐藏输入注入到表单中,该输入连接字段并正确命名,但这感觉不对。


我建议您使用自定义模型活页夹:

using System;
using System.Globalization;
using System.Web.Mvc;

public class MyClassBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = (MyClass)base.CreateModel(controllerContext, bindingContext, modelType);

        var day = bindingContext.ValueProvider["MyDate-Day"];
        var month = bindingContext.ValueProvider["MyDate-Month"];
        var year = bindingContext.ValueProvider["MyDate-Year"];

        var dateStr = string.Format("{0}/{1}/{2}", month.AttemptedValue, day.AttemptedValue, year.AttemptedValue);
        DateTime date;
        if (DateTime.TryParseExact(dateStr, "MM/dd/yyyy", null, DateTimeStyles.None, out date))
        {
            model.MyDate = date;
        }
        else
        {
            bindingContext.ModelState.AddModelError("MyDate", "MyDate has invalid format");
        }

        bindingContext.ModelState.SetModelValue("MyDate-Day", day);
        bindingContext.ModelState.SetModelValue("MyDate-Month", month);
        bindingContext.ModelState.SetModelValue("MyDate-Year", year);

        return model;
    }
}

这将您的控制器操作简化为:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyAction(MyClass myClass)
{
    if (!ModelState.IsValid)
    {
        return View(myClass);
    }
    // Do something with myClass
    return RedirectToAction("success");
}

并在 Global.asax 中注册绑定器:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.Add(typeof(MyClass), new MyClassBinder());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当名称不匹配时 MVC UpdateModel 的相关文章

  • ASP.NET MVC 应用程序和 ASP.NET Web 应用程序有什么区别

    任何人都可以解释一下 ASP NET 中的 MVC 和 Web 应用程序之间的区别 在mvc中我们可以找到controllers文件夹 我们不能在 Web 应用程序中找到控制器文件夹吗 请消除我的困惑 MVC 使用控制器来编排模型和视图 以
  • 单选按钮更改事件

    我有 2 个单选按钮 例如 ID 和名称
  • 为什么 DropDownListFor 无法识别编辑器模板中的选定值?

    我有以下名为 DropDown cshtml 的编辑器模板 这list部分工作正常 模板使用了一些我所做的巫毒来获得所需的SelectList from ViewData 控制器将视图模型中的所有选择列表放入ViewData 并且列表方面没
  • ASP.Net MVC 4 通用主要难点

    我正在开发一个ASP NET MVC 4Web应用程序 以前我的 MVC 应用程序是使用MVC 3和这个新的MVC 4我刚刚复制 重复使用了我的应用程序认证和授权码从以前的应用程序 当用户登录我的网站时 我会执行以下操作 账户控制器 pub
  • 尝试通过安全透明方法 xxx 访问安全关键 yy

    我刚刚开始学习 ASP NET MVC 并遵循 ASP NET MVC 教程 我正在使用 Visual Studio Express 2013 RC for Web 认为这可能是我的问题的原因 因为分页教程是使用 VS2012 编写的 一切
  • ASP.NET MVC,Bootstrap Tables,获取每列的值

    在 ASP NET MVC 中 我有一个操作 它接受有关行和列的用户输入 然后导航到根据用户输入生成所需行数和列数的操作 如下所示 Views div class container style width 1px div class ro
  • mvc 登录尝试失败后生成验证码

    所以我能够让我的验证码工作正常工作 但我的问题是 我想让它只在 3 次尝试后出现 我的一个选择是将用户重定向到一个已经有验证码的视图 重复登录 但带有验证码 然后让他通过该页面登录 还有其他选择吗 我觉得部分视图会导致页面发布出现问题 您认
  • 用户注销速度非常快

    我正在使用 ASP NET 身份成员身份 这是 Startup Auth cs 代码 app CreatePerOwinContext EFDbContext Create app CreatePerOwinContext
  • 如何在 ASP.NET MVC 中手动设置用户角色?

    我正在从事的这个项目要求我保留管理员用户的本地数据库 并为普通用户使用外部数据库 在管理数据库中通过身份验证的任何人都应被分配 管理员 角色 而通过其他数据库进行身份验证的任何人将始终被分配 用户 角色 我可以手动分配这些角色吗 我不需要角
  • ASP.NET Core MVC防伪

    尝试在核心 mvc 项目中打开防伪功能 但没有成功 做了什么 添加过滤器以自动检查每个 POST 请求的防伪令牌 services AddMvc o gt o Filters Add new AutoValidateAntiforgeryT
  • 具有实体框架的 MVC 控制器的 T4 模板 - 主机的成员属性 (MvcTextTemplateHost)?

    有谁有我可以在 MVC 3 附带的 T4 模板 ControllerWithContext tt 中使用的 Host 对象成员的完整引用吗 我已经尝试了我能想到的所有谷歌搜索 但唯一相关的结果是这个页面 http blogs msdn co
  • 从 .Net MVC 视图获取 HTML,而不在浏览器中实际渲染视图?

    我的控制器中有一个 ActionResult 我想从中发送 HTML 电子邮件 该电子邮件的正文是由视图生成的 我可以在传递模型时获取视图的结果并避免将其发送到浏览器 而不是在控制器中使用 2 个 actionresults 方法吗 Mvc
  • PostAsync 方法的 HttpClient 错误

    使用 HttpClient 对第 3 方 API 进行 PostAsync 调用时 当我执行 client PostAsync 时 我正好看到此错误 知道是什么原因造成的吗 Code public class JobController A
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont
  • ASP.NET MVC 子操作的路由匹配

    子动作的路由匹配方法与普通动作有什么不同吗 换句话说 子操作是否有一些自动生成的 url 来进行与父操作类似的匹配 父级或子级动作处理没有区别 任何操作都遵循您在中设置的相同路线定义Application Start 这意味着父母的行为以及
  • ASP.NET MVC 和 Expression XAML - 如何集成?

    一些背景 ASP net MVC 主要是构建和开发 ASP NET 应用程序方式的范式转变 从 代码隐藏 类型的心态转变为更像标准 MVC Ruby on Rails 的心态 我赞扬它作为一种简化工具来简化单元测试和代码分离 尽管 html
  • MVC 项目中的 .Rdlc 报告 - 托管调试助手“PInvokeStackImbalance”

    我即将完成并运行我的上一份报告 我在其他报告中没有遇到过这个问题 我正在尝试根据数据库记录创建报告 当我通过 LocalReport 创建报告并为报告创建参数时 收到错误消息 托管调试助手 PInvokeStackImbalance 调用
  • Visual Studio 智能感知搞砸了

    所以我是 MVC4 和 C 的新手 我已经设计这个网站大约两周了 智能感知没有任何问题 两天来 Visual studio 告诉我 Viewbag 和其他 命令不是我的项目的一部分 我可能错过了一些东西 或者它告诉我 Viewbag 在当前
  • IsReusable 属性中的上下文切换

    是否可重用属性 下面是我的理解IsReusable财产 如果处理程序返回静态内容 将值设置为 true 是安全的 但如果线程返回动态内容 为了使其线程安全 IsReusable应设置为 false 在这种情况下 可能会发生上下文切换 这可能
  • Ajax 表单从 Jquery 对话框内重定向页面

    我在部分视图中有一个 jquery 对话框 model JQueryDialogPoc Models FeedBack using Ajax BeginForm GiveFeedback Home null new AjaxOptions

随机推荐