2014-08-27 71 views
0

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

如果有人需要更多信息,请留下评论,我会更新问题。

+0

而是返回查看(“ManageAccount”,model);尝试使用返回redirecttoaction(“ManageAccount”) – 2014-08-27 09:40:42

+0

虽然我同意这种解决问题,但它不是一个完整的解决方案。代码中有些地方需要执行额外的ModelState检查,这些检查无法通过Data Annotations完成,因此执行RedirectToAction会删除需要传递给视图的所有错误消息。另外,它会销毁用户输入的所有数据,因为它会被新的数据库调用覆盖,进而会从网站中删除用户友好的元素。这两个原因是我使用'return View(“ViewName”,model)''的原因。 – Damian 2014-08-27 09:50:08

+0

我可以给你一个完整的模型的解决方案,即模型值不会丢失........ – 2014-08-27 09:54:27

回答

0

因此...经过一天的研究,我终于找到了这个问题的原因(种)。我不想在数据库更新的情况下走AJAX路线,所以我一直在努力并纠正/理解问题。

我最后的努力是从'AccountsController'中删除功能并将其放在其他位置(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最近才被配置为在这个庄园中工作,关于错误页面,直到我开始进行一些额外的测试时才被发现。

我很欣赏提供的帮助。

0

我认为问题是可能您的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); 
} 

这样一来就会更清楚什么样的数据,你编辑和您的视图模型可以有“秀只有“数据,而无需将其发布以匹配控制器参数。

+0

视图模型中有一项继承了另一个模型(ManageAccountPassword)的数据。我把它和其他任何代码链接到视图中,我仍然遇到同样的问题。即使在HTTPPOST中重新映射一组全新的数据库数据也会产生相同的问题。 – Damian 2014-08-27 10:49:13

+0

对不起,但我只能在答案 – DaniCE 2014-08-27 10:53:49

+0

中重复推荐这是一个公平的评论,我会努力研究这一点,如果我找到答案,我会尽量发布它以备将来参考。 – Damian 2014-08-27 11:04:23