首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Request.Form时被EditorFor重写的模型值

使用Request.Form时被EditorFor重写的模型值
EN

Stack Overflow用户
提问于 2015-02-02 15:53:57
回答 1查看 215关注 0票数 0

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

向导的每个步骤都被提交到相同的操作方法(它需要高度可扩展),并且所有步骤视图模型都是从相同的基本模型继承的。它们被定制的模型粘合剂绑定到它们的混凝土类型上。submit操作保存表单字段并返回下一个步骤(如果出现错误,则返回相同的步骤)。

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

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

真正奇怪的是,对于所有的Request.Form调用,模型值都被EditorFor值覆盖,但对于特定的调用却没有:

代码语言:javascript
运行
复制
// 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

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

代码语言:javascript
运行
复制
    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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 16:17:49

解决方案:好的和丑陋的

正如上面链接的文章所描述的,MVC在从帖子返回时似乎更倾向于模型状态值。这是因为在POST中重新显示表单应该始终表示验证失败。因此,正确的解决方案是保存、重定向到GET请求并显示新表单。这将解决问题,这是我要做的,当我有时间重构。

临时解决方案是清除模型状态。这将使它倒退到模型。这是我的临时解决办法:

代码语言:javascript
运行
复制
if (failureStatus == null && ModelState.IsValid)
{
    ModelState.Clear();
}

return View(result);

这里的危险在于我已经清除了模型状态。从长远来看,这会带来什么后果呢?新的臭虫冒险即将来临。但我在计时。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28281561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档