C# 返回视图()的路由/页面呈现问题
我在MVCC# 返回视图()的路由/页面呈现问题,c#,html,asp.net-mvc-4,razor,C#,Html,Asp.net Mvc 4,Razor,我在MVCreturn View()中遇到了一个奇怪的问题,我不确定是什么导致了这个问题,也不知道为什么,因为我在整个项目中做了大量的return View(“ViewName”,model) 在进入页面时,对数据库进行了调用,所有内容都正确映射,并按照我的预期传递到视图 public ActionResult ManageAccount() { var user = UserRepository.GetById(WebUserSecurity.CurrentUserId); v
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);
}
我猜这是一个路由问题,但我不确定如何在当前版本的代码中解决这个问题。我下一步要做的就是使用JQuery验证和AJAX调用进行表单更新。然而,这是一个黑客攻击,我想了解为什么会发生这种情况,因为我可能会在将来遇到这个问题,而不是奢侈地使用AJAX
如果有人需要任何进一步的信息,请留下评论,我会更新问题。我认为问题在于您的ManageViewModel可能包含HTTP post中未包含的字段,因此不会调用该操作(您可以使用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);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ManageCount(字符串名称)
{
var user=UserRepository.GetById(WebUserSecurity.CurrentUserId);
var model=Mapper.Map(用户);
//模型更新:
model.Name=名称;
//验证检查。。。
if(String.IsNullOrEmpty(model.Name)){
//添加模型错误
}
如果(!ModelState.IsValid)
{
返回视图(模型);
}
//保存更改。。。
返回视图(模型);
}
这样,您可以更清楚地编辑哪些数据,并且您的viewModel可以具有“仅显示”数据,而无需发布数据以匹配控制器参数。因此。。。经过一天的调查,我终于找到了原因。我不想走AJAX路线进行数据库更新,所以我继续努力纠正/理解这个问题 我最后的努力是删除“AccountsController”的功能,并将其放在其他地方(HomeController),以消除特定于此控制器的代码影响预期结果的可能性
返回视图(“视图名称”,模型)
现在可以按预期工作。现在,下一个任务是跟踪AccountsController与HomeController在ManageCount方面的行为不同的原因,因为这两个操作都继承自相同的类
编辑-解决方案
以下链接解决了该问题:
我们的代码通过web.config文件重定向到IIS或自定义错误页面。如果我们抛出HttpNotFound或服务器错误,代码就具备了所需的一切。但是,它缺少错误处理的httpErrors部分中的现有响应配置。如果没有这一点点代码,它不允许我传递自定义错误消息,而是将用户重定向到“错误请求”页面
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
// Error Pages here
</httpErrors>
//这里有错误页面
添加existingResponse已修复该问题,并使应用程序的其余部分保持完整的工作状态。我相信这只是最近才被注意到的,因为web.config最近才被配置为在这个庄园中工作,关于错误页面,直到我开始做一些额外的测试才被发现
感谢您提供的帮助。相反,返回视图(“ManageCount”,model);尝试使用return redirecttoaction(“ManageAccount”)虽然我同意这种方法可以解决问题,但它并不是一个完整的解决方案。代码中有一些地方需要执行额外的ModelState检查,这些检查无法通过数据注释完成,因此执行RedirectToAction会删除需要传递到视图的所有错误消息。此外,它会销毁用户输入的所有数据,因为它会被对数据库的新调用覆盖,从而从网站中删除用户友好的元素。这两个原因就是我使用返回视图(“ViewName”,model)的原因。我可以给你一个完整模型的解决方案,即模型值不会丢失……。请放心,我会看一看并查看答案,如果它有效并且适合保留系统功能,我会将您的答案标记为正确。当您在表单中发布帖子时,它是否会进入ManageCount(ManageViewModel)操作?如果不是,可能是因为您的帖子没有包含所有ManageViewModel参数……视图模型中有一项从另一个模型(ManageAccountPassword)继承数据。我在视图中删除了这个和任何其他与之相关的代码,但仍然遇到同样的问题。即使在HTTPPOST中重新映射一组新的数据库数据也会产生同样的问题。抱歉,但我只能在回答中重复这一建议,这是一个公平的评论,我将努力研究这一点,如果我找到答案,我将尝试将其发布以供将来参考。
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
// Error Pages here
</httpErrors>