首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从react调用控制器方法

如何从react调用控制器方法
EN

Stack Overflow用户
提问于 2019-10-30 22:04:03
回答 2查看 2.8K关注 0票数 0

我正在尝试学习ASP.NET Core3.0的React,我在调用控制器的方法时遇到了一些问题。如果控制器有像Get()这样的单一方法,那么一切都很好。但如果它有多个,那么它就是错误的。类似于多个端点冲突。我不能理解,也找不到任何关于这方面的信息。

我用下面这样的代码调用方法:

代码语言:javascript
复制
await FetchData(){
    const response = await fetch('api/article/makenewpost/?id=');
    const data = await response.json();
    this.setState({data:data});
}
代码语言:javascript
复制
async fetchData() {
        const response = await fetch('api/article/getarticles/?id=' + this.props.id);
        const data = await response.json();
        this.setState({ blocktitle: this.props.blocktitle, data: data, id: this.props.id });
    }

作为临时解决方案,我使用switch语句在控制器中创建了Get方法,但它在我看来非常糟糕。

代码语言:javascript
复制
public IActionResult Get(int? id, string method){
    switch (method)
    {
        case "GetArticles":
        {...}
        case "MakeNewPost":
        {...}
    }
}

更新:尝试过saidutt的解决方案。不再有冲突,但作为响应,我得到了类似清单文件的东西,所以我读到它是错误的。为什么我得不到正确的回答?我只是将我的方法与单一的切换方法分开。

代码语言:javascript
复制
[Route("api/[controller]")]
public class ArticleController : Controller
{
    private readonly DzikanContext _context;
    public ArticleController(DzikanContext context)
    {
        _context = context;
    }
    // GET: api/<controller>        

    [Route("api/[controller]/getarticles")]        
    public IActionResult GetArticles(int id)
    {


        var titles = _context.Post.Where(p => p.TypeId == id).Select(p => p);
        var filtered = titles.Skip(Math.Max(0, titles.Count() - 3)).ToList();


        Dictionary<int, string> icons = new Dictionary<int, string>
        {
            {1, "someUrl" },
            {2, "someUrl2"},
            {3, "someUrl3" }

        };

        List<PostsPayload> articles = new List<PostsPayload>();

        foreach (var title in filtered)
        {
            articles.Add(new PostsPayload
            {
                IconUrl = icons[title.ResourceId],
                ArticleBody = title.Title
            });
        }
        return Json(articles.ToArray());
    }

    [Route("api/[controller]/makenewpost")]
    public IActionResult MakeNewPost(int id)
    {
        var articles = _context.Post.Where(p => p.Id == id).Select(p => p);
        var title = articles.Select(p => p.Title).First();
        var body = articles.Select(p => p.Body).First();
        List<Post> posts = new List<Post>{
               new Post
                {
                    Title = title,
                    Body = body
                }};
        return Json(posts.ToArray());
    }
}

正如我前面所说的,当我使用带有switch的单一方法时(当我将它们分开时,方法中没有任何改变),它工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 22:08:40

将路由添加到控制器中的各个端点。

代码语言:javascript
复制
[Route("api/posts/createnewpost")]
public IActionResult CreateNewPost(...) { /* your logic */ }
票数 0
EN

Stack Overflow用户

发布于 2020-12-23 03:56:14

代码语言:javascript
复制
[Route("api/[controller]")]
[ApiController]
public class ArticleController : Controller
{
    private readonly DzikanContext _context;
    public ArticleController(DzikanContext context)
    {
        _context = context;
    }
    // GET: api/<controller>        

    [HttpGet]        
    public IActionResult GetArticles(int id)
    {


        var titles = _context.Post.Where(p => p.TypeId == id).Select(p => p);
        var filtered = titles.Skip(Math.Max(0, titles.Count() - 3)).ToList();


        Dictionary<int, string> icons = new Dictionary<int, string>
        {
            {1, "someUrl" },
            {2, "someUrl2"},
            {3, "someUrl3" }

        };

        List<PostsPayload> articles = new List<PostsPayload>();

        foreach (var title in filtered)
        {
            articles.Add(new PostsPayload
            {
                IconUrl = icons[title.ResourceId],
                ArticleBody = title.Title
            });
        }
        return Json(articles.ToArray());
    }
    // api/<controller>/makenewpost
    [HttpGet("makenewpost")]
    public IActionResult MakeNewPost(int id)
    {
        var articles = _context.Post.Where(p => p.Id == id).Select(p => p);
        var title = articles.Select(p => p.Title).First();
        var body = articles.Select(p => p.Body).First();
        List<Post> posts = new List<Post>{
               new Post
                {
                    Title = title,
                    Body = body
                }};
        return Json(posts.ToArray());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58627139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档