【发布时间】:2009-01-04 18:52:12
【问题描述】:
我有一个控制器有两个动作:
[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);
}
如您所见,当表单发布其数据时,添加操作使用 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 的值,因为用户输入的是字符串而不是整数。
由于添加操作返回视图并传递模型(return View(gig);)如果模型状态无效,则当使用验证消息重新显示表单时,文本框中不会显示值“TEST” .相反,它将是 gig.StartDate.Hour 的默认值。
如何解决这个问题?我真的卡住了!
【问题讨论】:
标签: asp.net-mvc forms repopulation