gpt4 book ai didi

asp.net-mvc - 名称不匹配时的 MVC UpdateModel

转载 作者:行者123 更新时间:2023-12-01 08:42:08 25 4
gpt4 key购买 nike

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

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 的定义。有没有办法在项目中添加自定义绑定(bind)器来处理此类情况,或者如果 HTML 输入的名称不同(无论出于何种原因)?

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

最佳答案

我建议您使用自定义模型绑定(bind)器:

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;
}
}

这将您的 Controller 操作简化为:

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

并在 Global.asax 中注册 binder:

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(MyClass), new MyClassBinder());
}

关于asp.net-mvc - 名称不匹配时的 MVC UpdateModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173678/

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