我对MVC return View()
有一个奇怪的问题,我不确定是什么导致了它,以及为什么我在整个项目中做了很多return View("ViewName", model)
。< / p>
在进入页面时,会对数据库进行调用,所有内容都会正确映射并传递给视图,如我所料。
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 Validation和AJAX调用进行表单更新。然而,这是一个黑客攻击,我想了解为什么会发生这种情况,因为我将来可能会遇到这个问题而没有使用AJAX的奢侈。
如果有人需要任何进一步的信息,请发表评论,我会更新问题。
答案 0 :(得分:0)
我认为问题在于,您的ManageViewModel可能包含未包含在HTTP帖子中的字段,因此不会调用Action(您可以使用firebug等工具检查帖子字段)。
我建议post post仅包含需要编辑的字段,如:
[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);
}
通过这种方式,您可以更清楚地编辑哪些数据,并且您的viewModel可以具有“仅显示”数据,而无需将其发布以匹配控制器参数。
答案 1 :(得分:0)
所以...经过一天调查这个问题后,我终于找到了路线原因(种类)。我不想通过数据库更新沿着AJAX路线前进,所以我继续努力并纠正/理解问题。
我最后的努力是删除&#39; AccountsController&#39;并把它放在其他地方(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最近才被配置为在这个庄园中工作,关于错误页面并且在我开始进行一些额外的测试之前没有发现。
感谢您提供的帮助。