ASP.NET MVC在一个视图中返回3个动作?

时间:2018-02-13 13:13:22

标签: c# asp.net-mvc

我遇到了一个小问题,我试图在一个视图中显示Facebook,Instagram和Twitter并按日期排序,但我不确定如何实现这一目标

这是我的Twitter的ActionResult,然后我对Instagram和Facebook几乎完全相同

        var twitterContext = new TwitterContext(auth);
        ulong sinceId = 1;
        const int Count = 20;

        var combinedSearchResults = new List<Status>();
        var tweets =
            await
            (from tweet in twitterContext.Status
             where tweet.Type == StatusType.User &&
             tweet.Count == Count &&
             tweet.RetweetedStatus.StatusID == 0 &&
             tweet.ExcludeReplies == true &&

             tweet.SinceID == sinceId

             select new NewsViewModel
             {
                 DateAdded = tweet.CreatedAt,
                 ScreenName = tweet.User.ScreenNameResponse,
                 Text = tweet.Text,
                 StatusId = tweet.StatusID
             })
            .ToListAsync();
        return View(tweets);

    }

如何将所有这3个放在一起并在索引视图中显示? 我对这些东西不熟悉,非常感谢答案和帮助

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您想要获取所有三个来源并将它们一起显示在一个列表中。

假设您可以将所有三种转换为NewsViewModel类型,那么只需将Facebook和Instagram的结果添加到同一列表中,然后将一个列表传递给您的视图。

所以你不要使用三个视图 - 你从控制器中的三个数据源获取数据,然后将统一列表传递给一个视图。

这样的事情(巩固,但你明白了):

var posts = await (from tweet ...).ToListAsync(); //what you already have
posts.AddRange(await (from facebook ....).ToListAsync());
posts.AddRange(await (from instagram ....).ToListAsync());
return View(posts);

答案 1 :(得分:1)

ASP.NET Core

可以通过创建来自Microsoft.AspNetCore.Mvc.ViewComponent

的三个组件来实现
public class TwitterViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(string parameter)
    {
        ...
        return View(tweets);
    }
}

然后根据您的需要创建公共视图Views\Shared\Components\Twitter\Default.cshtml或特定于控制器视图Views\[controllerName]\Components\Twitter\Default.cshtml

然后你可以像这样呈现你的组件:

<div>
    @await Component.InvokeAsync("Twitter", new { parameter = "parameterValue"})
</div>

ASP.NET MVC 5及更早版本

您可以在视图中渲染子操作:

<div>
    @{Html.RenderAction("Twitter");}
</div>

答案 2 :(得分:0)

可能你想要这个:

var postList = new PostList();
var twitterPost = await GetTwitterpost(....);
var fbPost = await GetFbPost(....);
var instagramPost = await GetInstagramPost(....);
if(twitterPost !=null)
  postList.AddRange(twitterPost);
if(fbPost !=null)
  postList.AddRange(fbPost);
if(instagramPost !=null)
  postList.AddRange(instagramPost);

postList = postList?.OrderByDescending(p=>p.DateAdded).ToList();

return View(postList);

我不知道我是否真的明白你的意思!但是通过这种方式,您可以在一个集合中获得所有帖子,并且可以按日期显示它们。