C# 返回视图()的路由/页面呈现问题

C# 返回视图()的路由/页面呈现问题,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

我在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);
}
我猜这是一个路由问题,但我不确定如何在当前版本的代码中解决这个问题。我下一步要做的就是使用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>