模型值未设置

时间:2018-03-14 08:44:49

标签: c# asp.net-mvc asp.net-core-mvc

我正在Asp.Net Core中创建一个CRUD应用程序

添加操作后,我将重定向到同一视图,并将模型值设置为null以获取另一个条目

以下是我的代码

public IActionResult Add(OptionMasterVM model)
    {
        try
        {
            model.QuestionList = context.QuestionMaster.Select(x => new SelectListItem { Text = x.QuestionName, Value = x.QuestionId.ToString() }).ToList();

            if (HttpContext.Request.Method == "POST")
            {
                OptionMaster _optionmaster = new OptionMaster();
                _optionmaster = model.OptionMaster;
                using (var ctx = new QuestionnaireEntities(_configuration))
                {
                    ctx.OptionMaster.Add(_optionmaster);
                    ctx.SaveChanges();
                }
                TempData["Msg"] = "Option Added Successfully , Add Another Option";
                model.OptionMaster.OptionValue = string.Empty;
                model.OptionMaster.OptionRating = 0;
                return View(model);
            }
        }
        catch (Exception ex)
        {
            logger.LogError(ex);
        }
        finally
        {
        }
        return View(model);
    }

这里我将Option Value设置为空并评级为Zero以进行下一个输入,但是在视图中它不显示空和零,在视图中它显示先前填充的值。

enter image description here

设置下面的代码后,这两个字段应该重置,但它们不是

model.OptionMaster.OptionValue = string.Empty;
model.OptionMaster.OptionRating = 0;

在Asp.net Core中有没有其他方法可以将模型对象设置为null?

2 个答案:

答案 0 :(得分:2)

这可能发生,因为Razor助手使用的是ModelState中的值,而不是模型本身。您的OptionValue可能使用帮助程序显示,例如:

@Html.TextBoxFor(m => m.OptionMaster.OptionValue)

在操作中更改模型值时,需要在渲染视图之前从ModelState中删除旧值。

最简单的方法是拨打ModelState.Clear()

model.OptionMaster.OptionValue = string.Empty;
model.OptionMaster.OptionRating = 0;

ModelState.Clear();     // ensure these changes are rendered in the View

return View(model);

答案 1 :(得分:1)

为绑定表单字段显示的值来自ModelState,它是根据RequestViewData / ViewBag以及最后Model的值组成的。发布后,很明显,您将在Request中设置值,因此ModelState中的值为ModelState。它以这种方式工作,因此当出现验证错误并且用户返回到表单以纠正错误时,他们发布的值将在那里供他们编辑。

长短,你需要遵循PRG(Post-Redirect-Get)模式。基本上,发布后,您只返回错误视图。如果帖子成功,则重定向。这不仅可以清除function myInsertTest() { Word.run(function(context) { var selectedRange = context.document.getSelection(); selectedRange.insertText("myText", "End"); selectedRange.insertText("\r\n", "End"); selectedRange.select("End"); return context.sync(); }); } ,还可以防止用户尝试刷新页面时意外重新发布。

如果您想将用户带回同一视图,只需重定向到相同的操作,但您需要进行重定向,而不是返回视图。