返回视图的路由/页面渲染问题()

时间:2014-08-27 09:34:49

标签: c# html asp.net-mvc-4 razor

我对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的奢侈。

如果有人需要任何进一步的信息,请发表评论,我会更新问题。

2 个答案:

答案 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不同。

编辑 - 解决方案

以下链接解决了问题:

Git Hub Answer

我们的代码通过web.config文件重定向到IIS或自定义错误页面。如果我们抛出HttpNotFound或Server Error,代码就拥有了所需的一切。但是,它错过了错误处理的httpErrors部分中的existingResponse配置。如果没有这些代码,它就不允许我传递自定义错误消息,而是将用户重定向到“错误请求”。页。

<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
    // Error Pages here
</httpErrors>

添加existingResponse解决了问题,并使应用程序的其余部分保持完整的工作状态。我相信这最近才被注意到,因为web.config最近才被配置为在这个庄园中工作,关于错误页面并且在我开始进行一些额外的测试之前没有发现。

感谢您提供的帮助。