ASP.NET MVC表格重新填充

ias*_*ons 6 forms asp.net-mvc repopulation

我有一个控制器有两个动作:

[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);
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,当表单发布其数据时,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");
        }
Run Code Online (Sandbox Code Playgroud)

表单包含一个ID为"StartDate.Hour"的文本框.

如上所示,GigBinder测试用户是否在文本框中输入了一个整数,其中包含id"StartDate.Hour".如果没有,则使用AddModelError将模型错误添加到模型状态.

由于gigs属性gigs.StartDate.Hour是强类型的,因此如果用户在表单文本框中键入了这个值,我就无法将其值设置为"TEST".

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

由于Add Action返回视图并传递模型(返回View(gig);)如果modelstate无效,当表单重新显示验证消息时,值"TEST"不会显示在文本框中.相反,它将是gig.StartDate.Hour的默认值.

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

Dom*_*tts 1

你能在你的PrepareViewDataForAddAction方法中做到这一点吗?

if (!ViewData.ModelState.IsValid)
    {
        ViewData["StartDate.Hour"] = "Error";
    }
Run Code Online (Sandbox Code Playgroud)

表单上的其他字段仍将根据 Gig 对象的属性进行填充。