gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 表单重新填充

转载 作者:行者123 更新时间:2023-12-04 15:28:39 24 4
gpt4 key购买 nike

我有一个有两个 Action 的 Controller :

[AcceptVerbs("GET")]
public ActionResult Add()
{
PrepareViewDataForAddAction();
return View();
}


[AcceptVerbs("POST")]
public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection)
{
if (ViewData.ModelState.IsValid)
{
GigManager.Save(gig);
return RedirectToAction("Index", gig.ID);
}
PrepareViewDataForAddAction();
return View(gig);
}

如您所见,当表单发布其数据时,Add 操作使用 GigBinder(IModelBinder 的实现)

在这个活页夹中,我有:
 if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour))
{
gig.StartDate.Hour = hour;
}
else
{
bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open");
}

该表单包含一个 ID 为“StartDate.Hour”的文本框。

正如您在上面看到的,GigBinder 测试以查看用户是否在 ID 为“StartDate.Hour”的文本框中键入了一个整数。如果不是,则使用 AddModelError 将模型错误添加到模型状态。

由于 gigs 属性 gigs.StartDate.Hour 是强类型的,如果用户已将其输入到表单文本框中,我无法将其值设置为例如“TEST”。

因此,我无法设置 gigs.StartDate.Hour 的值,因为用户输入的是字符串而不是整数。

由于添加操作返回 View 并传递模型(返回 View (gig);)如果模型状态无效,则当表单重新显示并带有验证消息时,文本框中不会显示值“TEST”。相反,它将是 gig.StartDate.Hour 的默认值。

我如何解决这个问题?我真的卡住了!

最佳答案

我认为问题在于您的 ViewModel 与您的 View 不够匹配。在 MVC 中,您的 ViewModel 与您的 View 尽可能匹配非常重要。

在您的 ViewModel 中,您假设一个整数,但在您的 View 中,您使用 TextBox 来呈现属性,这将允许任何类型的文本。这里存在不匹配,您在尝试映射它们时遇到的困难是不匹配的症状。

我认为你应该:
1. 将 ViewModel 属性的类型更改为字符串,然后在您的 Controller 中进行验证以确保输入的字符串实际上是一个数字或:
2.将 View 呈现的控件更改为仅允许通过自定义控件或Javascript验证输入数字的控件(如@Qun Wang所推荐)

就个人而言,我推荐选项 1。这样 ViewModel 不依赖于 View 实现。

关于asp.net-mvc - ASP.NET MVC 表单重新填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411476/

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