繁体   English   中英

使用EditorFor时被Request.Form覆盖的模型值

[英]Model values overridden by Request.Form when using EditorFor

我正在构建一个向导-一系列表单步骤。

向导的每个步骤都将提交给相同的操作方法(它必须具有高度的可扩展性),并且所有步骤视图模型都从相同的基本模型继承。 它们通过自定义模型绑定器绑定到其具体类型。 Submit操作将保存表单字段并返回下一步(如果发生错误,则返回相同的步骤)。

它运作良好。 但是,某一时刻用户需要提供工作信息。 紧随主要工作之后的步骤是次要工作信息-相同的形式,相同的属性。 第二部分的视图模型继承自主视图模型,而不实现任何单独的属性(类定义为空)。

提交主表单后,将返回辅助视图模型,并重置值。 但是,由于某些原因,该表单会显示第一个viewmodels值。

真正奇怪的是,对于所有EditorFor调用,其模型值均被Request.Form值覆盖,但对于特定调用,则不:

// This displays correctly, showing the current model values
<div>Model says: @Model.AuthorizationNumber</div>
<div><input type="text" value="@Model.AuthorizationNumber"/></div>

// This displays the Request.Form value from the previous step.
@Html.EditorFor(x => x.AuthorizationNumber)

在上面的代码中,前两行(构造函数值)正确显示了授权号,但第三行不正确(显示Request.Form值)。

可能是什么问题呢?

编辑1

根据请求,控制器方法处理提交。

    public ActionResult Index(StepPathState model = null)
    {
        var isPreviousSubmit = Request.Form.AllKeys.Contains("submit-previous");

        if (model == null || model.Step == null) return View(Steps.GetFirstPathResult());

        // submit the step data
        var result = Steps.SubmitStepData(model, isPreviousSubmit);

        if (result.Status is StepSuccessAndFinish)
        {
            return Finish(result);
        }

        var failureStatus = result.Status as StepActionStatusFailure;

        if (failureStatus != null)
        {
            foreach (var error in failureStatus.Errors)
            {
                ModelState.AddModelError(error.Property, error.ErrorMessage);
            }
        }

        return View(result);
    }

我可能已经找到了答案: http : //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value。 ASPX

解决方案:好与丑

如上面链接的文章所述,从POST返回时,MVC似乎更喜欢modelstate值。 这是因为在POST中重新显示表单应始终表示验证失败。 因此,正确的解决方案是保存,重定向到GET请求并显示新表单。 这将解决问题,这是我有时间重构时要做的事情。

临时解决方案是清除modelstate。 这将导致它回退到模型。 这是我的临时解决方法:

if (failureStatus == null && ModelState.IsValid)
{
    ModelState.Clear();
}

return View(result);

这里的危险是我已经清除了模型状态。 从长远来看,这可能会带来什么? 新的错误冒险即将来临。 但是我在计时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM