我有一个使用ViewModel的表单视图。 Action“New”呈现新视图。提交此表单后,我将信息发送回“添加”操作。
如果DB上的所有操作都成功,我想刷新视图。我从“添加”操作中创建了一个新的viewmodel实例,并返回View(“New”,viewModel)。这不会刷新我的观点。所有旧值(已提交)仍保留在视图中。 有没有办法在没有RedirectToAction方法的情况下刷新页面。
我在另一篇文章中读到不应该使用ModelState.Clear,因为它可能会产生不良结果。
谢谢,
月
编辑1 - 添加代码
New
public ActionResult New(string id)
{
var sysId= new Guid(id);
.......
........
string Details = pDto.Name + "(" + pDto.Code + ")";
var vm= new ViewModel(id);
vm.Details = Details;
return View(vm);
}
public ActionResult Add(ViewModel vm)
{
ViewModel vm= vm;
if (ModelState.IsValid)
{
var dto= _qRepository.GetFeaturesBy(viewModel.Code);
if (dto!= null)
{
ModelState.AddModelError("Code", "Code is already in Use.");
return View("New", viewModel);
}
_productService.AddFeature(..........);
// ModelState.Clear(); -- this works
vm= new ViewModel(vm.pId) { Message = "Code" + viewModel.Code + " was added ......", Details = vm.Details };
}
return View ("New", vm);
}
答案 0 :(得分:5)
您应该尝试遵守post-redirect-get模式。您没有的唯一一次是发布失败并且您想要返回验证错误,以便客户端可以重新发布表单。这是从post action方法返回视图时发生的情况。所有这些表单值仍然在ModelState中浮动,等待在表单上再次使用。
如果您想让用户立即添加其他项目,可以使用RedirectToAction("New")
。此外,听起来两个操作都应该命名为New
,然后用[HttpPost]
属性和PostModel参数装饰帖子版本。如果你发布并在两个不同的动作之间进行操作,事情会变得混乱,因为那时你必须记住在html表单上明确设置动作,并且还要在验证失败时返回正确的视图。
答案 1 :(得分:4)
您的模型正在刷新。
问题是HTMLHelpers在使用您传递的新模型之前首先在ViewState和ModelState中查找数据。
你几乎没有选择但是要清除ModelState或自己手动更改ModelState条目。
答案 2 :(得分:0)
是填充了值属性的渲染,还是浏览器“自动填充”表单?
RedirectToAcction将导致302响应,然后新的“获取”到新表单。