zoukankan      html  css  js  c++  java
  • 关于webapi练习过程中遇到的一系列问题记录

    最近在尝试本地进行webapi调用的过程中,遇到一系列的问题,demo很小但着实让人头疼,先附上demo.

    前台页面,目的是展示新闻的分类:

    类别模型如下:

    控制器代码如下:

     public ActionResult Category()
            {
                List<MODELS.Type> type = bll.GetNewsType();
                ViewData["type"] = type;
                return View();
            }

    页面代码如下:

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Category</title>
        <link href="~/Content/bootstrap.css" rel="stylesheet" />
        <link href="~/Content/mydiy.css" rel="stylesheet" />
    </head>
    <body>
        <div class="wind">
            <div>
                <a href="javascript:;" id="add" class="btn btn-default">新增分类</a>
            </div>
            <table class="table">
                <th>类名</th>
                <th>该类目下新闻条数</th>
                <th>操作</th>
                @foreach (var type in (List<MODELS.Type>)ViewData["type"])
                {
                    <tr>
                        <td>@type.TypeName</td>
                        <td>@type.News.Count()</td>
                        <td>
                            <div class="tpl-table-black-operation">
                                <a class="tpl-table-black-operation-del" onclick="del('@type.Id','@type.News.Count()')">
                                    <i class="am-icon-trash"></i>删除
                                </a>
                            </div>
                        </td>
                    </tr>
                }
            </table>
            <!--点击新增的弹出层-->
            <div id="cslj">
                <div class="qhcq">
                    <div class="tcc" id="gbaaa"><img src="~/images/closeBlack.jpg" /></div>
                    <div id="nei">
                        <p>输入新增分类名:</p>
                        <input type="text" id="catename" />
                        <input type="button" id="addbtn" value="确定" />
                    </div>
                </div>
            </div>
        </div>
        <script src="~/Scripts/jquery-1.7.1.js"></script>
        <script>
            //显示弹出框
            $("#add").click(function () {
                $("#cslj").show();
            });
            /*关闭弹出框*/
            $("#gbaaa").click(function () {
                if ($("#cslj").css("display") == "block") {
                    $("#cslj").hide();
                }
            });
        </script>
        <script>
            //删除
            function del(id, count) {
                if (confirm("是否删除该条新闻?")) {
                    if (count == 0) {
                        // alert(count);
                        $.ajax({
                            type: "get",
                            url: "http://localhost:51064/api/Category/deleteCate",
                            data: { "id": id },
                            success: function (data) {
                                if (data == "OK") {
                                    alert("删除成功"); location.reload();
                                }
                                else
                                    alert("删除失败");
                            }
                        })
                    } else {
                        alert("该分类下面有含有新闻,不允许删除");
                        return false;
                    }
                }
            }
            //新增
            $("#addbtn").click(function () {
                // alert("新增成功");
                var name = $("#catename").val().trim();
                // alert(name);
                $.ajax({
                    type: "get",
                    url: "http://localhost:51064/api/Category/addCate",
                    data: { "name": name },
                    success: function (data) {
                        if (data == "exist") {
                            alert("对不起,分类已存在"); $("#cslj").hide(); window.location.reload();
                        } else if (data == "OK") {
                            alert("添加分类成功"); $("#cslj").hide(); window.location.reload();
                        } else {
                            alert("添加失败"); $("#cslj").hide(); window.location.reload();
                        }
                    }
                })
            })
        </script>
    </body>
    </html>

    页面呈现的效果如下:

    现在做的尝试是,利用webapi 的方式实现该页面上的新增和删除功能(有一点为了webapi而这样做的意味,而后的一些问题也着实让人感觉多此一举,此处就当是做一个了解)。在解决方案上新建一个web应用程序,

    此处我选择的是空模板,下面勾选 webapi(这里最开始我直接选择的是webapi模板而非空,结果出现了 找到了与该请求匹配的多个操作 ,多方搜集解决办法仍然无济于事(修改路由仍然无效),最后重新做了webapi项目的新建,即空模板此类的选择才最终没有出现这个问题。) 

    webapi中新建控制器 Category :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace webapi.Controllers
    {
        public class CategoryController : ApiController
        {
            BLL.BCategory bll = new BLL.BCategory();
    
            /// <summary>
            /// 得到所有的新闻分类
            /// </summary>
            /// <returns></returns>
            public IEnumerable<MODELS.Type> GetAll()
            {
                return bll.GetTypes();
            }
    
            /// <summary>
            /// 删除新闻分类
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            [HttpGet]
            public string deleteCate(int id)
            {
                if (bll.deleteCate(id))
                {
                    return "OK";
                }
                else
                {
                    return "NO";
                }
    
            }
    
            /// <summary>
            /// 新增新闻分类
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            [HttpGet]
            public string addCate(string name)  //此处没有使用[frombody]
            {
                if (bll.checkIsExist(name))
                {
                    MODELS.Type type = new MODELS.Type
                    {
                        News = null,  //由于类型模型与新闻模型有关联,所以需要指定新闻的所属
                        TypeName = name
                    };
    
                    if (bll.addCate(type))
                    {
                        return "OK";
                    }
                    else
                    {
                        return "No";
                    }
                }
                else
                {
                    return "exist";
                }
            }
        }
    }

    至此,搭建出来一个大致的模型,开始做自己的尝试的时候,出现了诸多的问题,在此做了部分个人觉得棘手的问题的记录:

    (1)webapi调试的时候无法找到对应的请求(找到了与该请求匹配的多个操作”)

    (2)webapi 指定的架构无效

    (3)AJAX调用时候无法跨域

    其中第一个问题:得以从修改路由上解决:

    在 App_start文件夹下面的webapiConfig文件里面修改,添加 action ,在使用AJAX调用的使用按照路由的格式进行URL的填写,

    ajax 代码如下:

     //删除
            function del(id, count) {
                if (confirm("是否删除该条新闻?")) {
                    if (count == 0) {
                        // alert(count);
                        $.ajax({
                            type: "get",
                            url: "http://localhost:51064/api/Category/deleteCate",
                            data: { "id": id },
                            success: function (data) {
                                if (data == "OK") {
                                    alert("删除成功"); location.reload();
                                }
                                else
                                    alert("删除失败");
                            }
                        })
                    } else {
                        alert("该分类下面有含有新闻,不允许删除");
                        return false;
                    }
                }
            }
            //新增
            $("#addbtn").click(function () {
                // alert("新增成功");
                var name = $("#catename").val().trim();
                // alert(name);
                $.ajax({
                    type: "get",
                    url: "http://localhost:51064/api/Category/addCate",
                    data: { "name": name },
                    success: function (data) {
                        if (data == "exist") {
                            alert("对不起,分类已存在"); $("#cslj").hide(); window.location.reload();
                        } else if (data == "OK") {
                            alert("添加分类成功"); $("#cslj").hide(); window.location.reload();
                        } else {
                            alert("添加失败"); $("#cslj").hide(); window.location.reload();
                        }
                    }
                })
            })

    第二个问题,指定架构无效,在此这个问题犹如MVC中的类似此问题的解决方式一样,NuGet 包 添加引用 EntityFramework.dll ,然后webconfig 中添加连接字符串,该问题得以解决。

     <connectionStrings>
        <add name="Model1Container" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=GraduationProject;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>

    第三个问题,AJAX调用跨域的问题,开始的时候尝试 ajax中用JSONP进行传输,但是失败了,最后找到的解决办法是在webapi所在项目的webconfig 中的 <system.webServer> 节点 添加如下代码:

     <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
          </customHeaders>
        </httpProtocol>

    至此得以解决三个问题,之后进行项目的调试,得以正确运行,以上三个是在项目中比较棘手的问题,当然还有一些小的问题,没有做如此详细的记载,简单的记录一下:

    Razor 语句中使用三目运算符,<input type="text" value="@(Model.PName == null?"":Model.PName)" />

    。。。

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/zhh-blogs/p/10334484.html
Copyright © 2011-2022 走看看