返回视图的路由/页面呈现问题()
我对MVC return View()
有一个奇怪的问题,我不确定是什么原因造成的,为什么我在整个项目中做了大量的return View("ViewName", model)
。返回视图的路由/页面呈现问题()
在进入页面时,对数据库进行调用,所有内容都被正确映射并传递给视图,如我所料。
public ActionResult ManageAccount()
{
var user = UserRepository.GetById(WebUserSecurity.CurrentUserId);
var model = Mapper.Map<Customer, ManageViewModel>(user);
return View("ManageAccount", model);
}
但是,如果出于某种原因,我需要返回到视图(如的ModelState是无效的),我传递回一个400 Bad Request
页面。我已经完成了流程的每个阶段,并且我知道我正在打开ManageAccount视图,但出于某种未知原因,这不是正在呈现的视图。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ManageAccount(ManageViewModel model)
{
if (ModelState.IsValid)
{
// DO SOME STUFF HERE
}
return View("ManageAccount", model);
}
@using (Html.BeginForm("ManageAccount", "Account", FormMethod.Post, null))
{
@Html.TextBoxFor(m => m.CustomerId)
@Html.AntiForgeryToken()
// RENDER SOME HTML HTML HERE
}
我猜这是一个路由问题,但我不知道如何去解决当前版本的代码中的问题。我的下一步行动就是使用JQuery验证和AJAX调用进行表单更新。然而,这是一个黑客攻击,我想了解为什么会发生这种情况,因为我将来可能会遇到这个问题,而且没有利用AJAX的奢侈品。
如果有人需要更多信息,请留下评论,我会更新问题。
因此...经过一天的研究,我终于找到了这个问题的原因(种)。我不想在数据库更新的情况下走AJAX路线,所以我一直在努力并纠正/理解问题。
我最后的努力是从'AccountsController'中删除功能并将其放在其他位置(HomeController),以消除特定于此控制器的代码影响预期结果的可能性。
return View("ViewName", model)
现在按预期工作。接下来的任务是跟踪为什么AccountsController对于HomeController的行为与ManageAccount的行为不同,因为这两个行为都是从同一类继承的。
编辑 - 破解
以下链接解决这个问题:
我们的代码通过web.config文件重定向到一个IIS或自定义错误页。如果我们抛出一个HttpNotFound或Server Error,代码就有了所需的一切。但是,它在错误处理的httpErrors部分中缺少existingResponse配置。如果没有这一小段代码,它不允许我传递自定义错误消息,而是将用户重定向到“错误请求”页面。
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
// Error Pages here
</httpErrors>
在existingResponse中添加已解决了问题,并使应用程序的其余部分处于完整工作状态。我相信这只是最近才被注意到,因为web.config最近才被配置为在这个庄园中工作,关于错误页面,直到我开始进行一些额外的测试时才被发现。
我很欣赏提供的帮助。
我认为问题是可能您的ManageViewModel包含未包含在HTTP帖子中的字段,并且因此Action未被调用(您可以使用类似于萤火虫的工具检查帖子字段)。
我将建议后行动只包含需要编辑的字段,是这样的:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ManageAccount(string name)
{
var user = UserRepository.GetById(WebUserSecurity.CurrentUserId);
var model = Mapper.Map<Customer, ManageViewModel>(user);
// model updates:
model.Name = name;
//validation checks...
if (String.IsNullOrEmpty(model.Name)) {
//add model error
}
if (!ModelState.IsValid)
{
return View(model);
}
// save changes...
return View(model);
}
这样一来就会更清楚什么样的数据,你编辑和您的视图模型可以有“秀只有“数据,而无需将其发布以匹配控制器参数。
而是返回查看(“ManageAccount”,model);尝试使用返回redirecttoaction(“ManageAccount”) – 2014-08-27 09:40:42
虽然我同意这种解决问题,但它不是一个完整的解决方案。代码中有些地方需要执行额外的ModelState检查,这些检查无法通过Data Annotations完成,因此执行RedirectToAction会删除需要传递给视图的所有错误消息。另外,它会销毁用户输入的所有数据,因为它会被新的数据库调用覆盖,进而会从网站中删除用户友好的元素。这两个原因是我使用'return View(“ViewName”,model)''的原因。 – Damian 2014-08-27 09:50:08
我可以给你一个完整的模型的解决方案,即模型值不会丢失........ – 2014-08-27 09:54:27