首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC控制器返回不同视图;模型数据未保存在隐藏输入中

MVC控制器返回不同视图;模型数据未保存在隐藏输入中
EN

Stack Overflow用户
提问于 2013-11-12 09:03:08
回答 1查看 1.8K关注 0票数 1

我尝试使用多页表单,其中使用单个控制器操作,并根据模型上的值返回视图。

我的模型有一个属性,我使用Html.HiddenFor()在视图中输入字段。

以下是我的简化模型:

代码语言:javascript
运行
复制
public class MyModel 
{
   public virtual int Step { get; set; }
}

在我看来,我有:

代码语言:javascript
运行
复制
@model MyModel
...
@Html.HiddenFor(model => model.Step)

在我的控制器里我有:

代码语言:javascript
运行
复制
public ActionResult Create()
{
    ...
    myModel.Step = 1;
    return View("View1", myModel);
}

[HttpPost]
public ActionResult Create(MyModel myModel)
{
    ...
    if (myModel.Step == 1)
    {
        myModel.Step = 2;
        return View("View2", myModel);
    }
    else if (myModel.Step == 2)
    {
        ...
    }
    ...
}

我的问题是,我的控制器总是认为mymodel.Step的值是1。为什么呢?

奇怪的是,我试图在表单上显示以下内容:

代码语言:javascript
运行
复制
@Html.DisplayFor(model => model.Step)
@Html.EditorFor(model => model.Step)

第二次显示页面时,第一行显示文本"2“。第二个显示了一个"1“的输入字段。我很困惑。

附加信息:

我的模型还有一个Guid属性,它在隐藏字段中传递给View。我还试图在回发时更改它,并在第二次检查它的值。新的价值没有登记。模型返回第一篇文章之前的原始值。因此,它与另一个领域是一致的。

我可能不得不使用不同的控制器动作,如果我找不到为什么它现在的行为方式。

解决方案:

正如Reda在下面建议的那样,我通过在我的post动作方法中这样做来修正它:

  • 在显示"View2“并对我的控制器对模型中的值进行更改之前,我运行ModelState.Clear()

下面是一个博客帖子,它确认需要清除此场景的ModelState。

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-12 09:40:32

通常,当您从post操作返回到视图时,这意味着在验证过程中发生了一些失败,并且应该使用提交的值再次显示表单。这就是为什么当您返回视图时,ModelState会记住您的输入,并且您的输入将从ModelState中填充,而不是您的视图模型。

在我看来,你有两个解决方案:

  • ModelState.Clear,它将在设置新值之前删除旧值。
  • 使用新值重定向到GET操作

第二个解决方案是更好的解决方案,因为您没有显示带有验证错误的旧表单,而只是显示一个具有不同值的新视图。

下面是一个例子(当然,您可以根据您的需要调整它):

代码语言:javascript
运行
复制
public ActionResult Create(int? step)
{
    ...
    myModel.Step = step.HasValue ? step.Value : 1; // or whatever logic you need to apply
    return View("View1", myModel);
}

[HttpPost]
public ActionResult Create(MyModel myModel)
{
    ...
    if (myModel.Step == 1)
    {
        return RedirectToAction("Create", new { step = 2 });
    }
    else if (myModel.Step == 2)
    {
        ...
    }
    ...
}
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19924904

复制
相关文章

相似问题

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