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)" />

    。。。

  • 相关阅读:
    Ant属性文件
    使用numpy处理数组
    机器学习实战之决策树(一)
    列表去掉重复元素
    cv2.putText,cv2.rectangle方法
    sklearn 中文文档
    numpy delete方法
    MATLAB ~的用法
    MATLAB 基础
    Python 遍历目录下的子目录和文件
  • 原文地址:https://www.cnblogs.com/zhh-blogs/p/10334484.html
Copyright © 2011-2022 走看看