假设我有以下代码,在记事本中模拟,所以请原谅任何小错误:)

//Default page
public ActionResult Index()
    {
        var musicViewModel
        {
         Albums = GetTopSellingAlbums(5),
         Genres = GetTopGenres(5),
         Artists = GetTopArtists(5)
         };

        return View(musicViewModel);
    }

[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
    {

        //For the example, pretend I have a class called musicStoreSubmission in my
        //viewmodel which holds a few different fields the user fills out.

        if(ModelState.IsValid)
        {
            //Do some actions based on the user submitting a form
        }

        //Else, refresh page with errors in Modelstate.
        var musicViewModel
        {
         Albums = GetTopSellingAlbums(5),
         Genres = GetTopGenres(5),
         Artists = GetTopArtists(5)
         };

        return View(musicViewModel);
    }

我担心的是,为了在 ModelState 无效的情况下回发任何错误,我需要再次生成 View 模型,以便可以创建页面上使用这些对象的任何元素(流派、艺术家等)。问题是它需要我将一些代码从 ActionResult 复制并粘贴到 ActionResult,这似乎使我的代码不是很 DRY。

有没有更好的方法来避免这样的重复代码?目前,我只是将 View 模型所需的任何默认对象的生成移动到单独的方法和/或构造函数中,但这有点困惑,因为我必须生成整个 Controller 可能需要的所有对象。我希望我能做的是将我的第二个索引操作指向第一个索引操作,并将其用作常规方法。我已经尝试了几种不同的方法来做到这一点,但似乎无法将 ActionResult 返回到另一个 ActionResult。

有什么想法吗?

最佳答案

您可以像这样返回另一个 ActionResult 方法:

[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
{
    if(ModelState.IsValid)
    {
        //Do some actions based on the user submitting a form
    }
    return MyAction();
}

或者您可以将发布的模型传递回 ViewResult
[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
{
    if(ModelState.IsValid)
    {
        //Do some actions based on the user submitting a form
    }
    return View(musicViewModel);
}

第二种方法更好,因为您不重建 ViewModel

关于asp.net-mvc - 从另一个 ActionResult 返回一个 ActionResult,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5047303/

10-12 17:19
查看更多