ASP.NET MVC中的HttpPost return View()会导致错误,因为它找不到cshtml文件。

3

我在Controller中编写HttpGet和HttpPost方法。HttpPost方法已经可以使用,但是我有一些关于从HttpPost重定向到HttpGet方法的问题。

[HttpGet]
public async Task<ActionResult> GetData(MyViewModel model)
{
    // Get Data 

    return View(model); 
}



[HttpPost]
public async Task<ActionResult> UpdateData(MyViewModel model)
{
            try
            {
                if (ModelState.IsValid)
                {
                    // Update updatedModelObject

                    //return RedirectToAction("GetData", updatedModelObject);
                    return RedirectToAction("GetData");
                }
            }
            catch (Exception)
            {
            }

            //return RedirectToAction("GetData", "MyController");

            //return RedirectToAction("GetData");

            return View(model);
}

当我点击页面上的提交按钮时,它会调用HttpPost UpdateData方法。如果ModelState.IsValid,则更新数据库并调用RedirectToAction("GetData")。它能正常工作,并调用HttpGet方法从数据库中获取另一个调用。这是我的问题,如果ModelState.IsValid为false,它将调用View(model),导致错误:
The view 'UpdateData' or its master was not found or no view
engine supports the searched locations. The following locations were
searched:
~/Views/MyController/UpdateData.cshtml
~/Views/MyController/UpdateData.vbhtml
~/Views/Shared/UpdateData.cshtml
~/Views/Shared/UpdateData.vbhtml
~/__MVCSITEMAPPROVIDER/UpdateData.ascx

我已经阅读了许多帖子,其中HttpGet和HttpPost方法的示例都被命名为Index(),这样就不会出现像我遇到的那样的错误。我使用了不同的HttpGet和HttpPost方法名称,因此它正在寻找UpdateData.cshtml。从我所读的文章中得知,如果Model.IsValid为true,则调用HttpGet以更新模型并传递更新后的模型。如果Model.IsValid为false,则文章中说要调用View(model)来传递相同的模型数据。

以下是我的问题:

  1. 如果代码中仍然在寻找UpdateData.cshtml,那么我应该调用什么而不是View(model)来传递包含相同模型数据的视图以刷新视图并避免错误?

  2. 如果ModelState.IsValid为true,则它将更新数据库并调用HttpGet方法从数据库获取更新后的数据,并将模型传递给GetData中的视图。但是,如果ModelState.IsValid为false,则它会调用View(model)。这个调用会调用HttpGet还是只是刷新视图并使用旧的模型数据?

谢谢。

如果在填充了模型后进行 HttpPost,然后调用 View("GetData", model),那么 GetData 方法会直接从数据库中获取数据并将其传递给 View 吗?将填充的模型传递给 GetData 方法是否会被绕过或忽略,而是使用从数据库传递给 View 的新模型呢? - user1250264
你需要指定视图名称,因为POST方法的名称与GET方法不匹配(请参见NikolaiDante的答案),但为什么不直接将POST方法命名为public async Task<ActionResult> GetData(MyViewModel model),这样就不需要指定视图名称了。最好使用标准的操作名称,如Edit()Create() - user3559349
1个回答

5

如果要刷新视图并避免错误,我应该用什么代替View(model)?因为当前代码在寻找UpdateData.cshtml。

可以使用以下代码将视图名称和模型一起传递,而不是使用return View(model);

return View("GetData", model);

如果ModelState.IsValid为false,则调用View(model)。这会调用HttpGet还是只是刷新带有旧模型数据的视图?已填充的模型与任何ModelState信息一起呈现给用户,以便他们可以修复验证。 GET操作不会再次处理。此文章提供了有关如何实现POST-REDIRECT-GET的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接