【问题标题】:Get information from database with ajax ASP.NET使用 ajax ASP.NET 从数据库中获取信息
【发布时间】:2015-03-09 13:50:48
【问题描述】:

每当select-字段发生变化时,我都会尝试从数据库中的表中获取一些信息。

我能够做出响应,并且 Ajax jQuery 函数返回成功(函数)
问题是我不知道如何使用 ASP.net MVC 从我的数据库返回数据。
我从我的 Ajax 成功调用中得到的响应是这样的文本:

ProduktWebKort.Models.WarehouseCustomer[]

这是我的控制器的一部分,带有通过 Ajax 调用的函数

[HttpPost]
public string OnChange(int id)
{
    return db.Customers.Where(C => C.CustomerID == id).ToString();
}

我的 Ajax 调用如下所示:

<script type="text/javascript">
$(function () {
    // Document.ready -> link up remove event handler
    $("#CustomerID").change(function () {
        alert("Hej");
        var option = $('option:selected', this).val();
        $.ajax({
            type: "POST",
            url: '@Url.Action("Index/1", "Session")',
            contentType: "application/json; charset=utf-8",
            data: { id: 1 },
            dataType: "html",
            success: function (success) {
                alert('Success');
                console.log(success);
                for (var i = 0; i < success.length; i++) {
                    $(".form-horizontal").append("<li>" + success[i] + "      </li>");
                    console.log(success);
                }
            },
            error: function (e, text, string) {
                alert(e.message + text + string);
                console.log(e);
            }
        });
    });
});
</script>

我想返回来自WarehouseCustomer 的每个条目,并从我的选择字段中返回ID 为CustomerID

【问题讨论】:

  • 通常为了响应 MVC 5 应用程序中的 AJAX 调用,您实际上会使用 Web API。当前函数返回什么,你希望它返回什么?
  • 你想做什么?获取一位具有特定 ID 的客户?或者获取客户列表?
  • 您真正在寻找什么?如果您只是在寻找建议,那么正如@mason 所说,您应该使用Web API 并返回一些 JSON 以将其与您的下拉菜单绑定,如果您有任何其他问题,请更新您的问题。
  • 它当前返回如下字符串: ProduktWebKort.Models.WarehouseCustomer[] 我正在尝试返回所有 WarehouseCustomers 的列表,其 CustomerID 由 select 选择
  • @SørenFritzbøger 您应该编辑您的问题以包含结果。对问题至关重要的信息(例如预期输出和实际输出)是问题的重要组成部分,因此属于问题本身而不是 cmets。

标签: jquery asp.net ajax asp.net-mvc


【解决方案1】:

.NET 中.ToString() 方法的默认实现是返回对象的类型。因此,您得到的结果文本正是您要处理的内容:WarehouseCustomer 对象数组:

ToString 方法的默认实现返回 Object 类型的完全限定名称,如下例所示。

要从服务器获取数据,您应该以 XML 或 JSON 形式(首选变体)序列化数据对象,以便在客户端解析它们。

您可以使用的方法有很多,因此您应该只选择您喜欢的一种。我建议您查看@mason 的回答,因为它看起来是解决您问题的最佳方法。

【讨论】:

    【解决方案2】:

    在 MVC 5 项目中,您使用 Web API 来响应 AJAX 请求。 Web API 检查请求中的请求内容以及客户端支持的格式。然后它会适当地序列化为 JSON 或 XML 或其他格式。它还紧跟 MVC 架构,并在即将到来的 MVC 6 中合并到 MVC 框架中。

    通过 NuGet 在您的项目中安装 Web API。启用attribute routing

    [RoutePrefix("api/customers")]
    public class CustomerController : ApiController
    {
        [Route("byid/{id}")]
        public List<Customer> GetCustomers(int id)
        {
            return db.Customers.Where(C=>C.CustomerID==id).ToList();
        }
    }
    

    这应该以客户端请求的数据格式(默认为 JSON)返回客户对象列表。

    您请求的 URL 应该是对 ~/api/customers/byid/{id} 的 HTTP GET 请求,例如:~/api/customers/byid/5。我经常使用 MVC Helper @Url.Content() 映射到客户端的 Web API。

    你的成功处理器应该是这样的:

    success: function (customers) {
                alert('Success');
                console.log(customers);
                for (var i = 0; i < customers.length; i++) {
                    $(".form-horizontal").append("<li>" + customers[i].Name + "</li>");
                    console.log(success);
                }
            },
    

    【讨论】:

    • 只是不明白为什么要使用 WebAPI,尤其是如果您根本不需要 WebAPI 来完成这项任务,请下载一些东西?
    • @teovankot “这个任务根本不需要 Web API”是什么意思? Web API 是在 MVC 项目中响应 AJAX 请求的标准方式。添加简单且集成良好。你确定你的答案有效吗?为什么在不修改数据的情况下使用HttpPost 属性装饰您的操作方法?那应该是HttpGet。而OnChange 不是命名应该返回客户对象集合的函数的好方法。
    • JSON Hijacking 是我用 POST 装饰这个方法的原因。对于这种情况,我只是不明白 WebAPI 和 Controller 方法之间有什么区别。如果你需要下载一些东西,而你却不能这样做,你为什么要这样做?关于命名方法是问题的作者。
    • @teovankot 你投反对票了吗?小心解释为什么? Web API 确实使用了控制器,也许您的意思是您不了解 MVC 和 Web API 之间的区别?它们很相似,但 Web API 面向编程的服务器/客户端交互,而 MVC 面向将 HTML 返回给客户端。它们都是 ASP.NET 的一部分,应该结合使用。
    【解决方案3】:

    您在服务器端和客户端的问题。 如果你想在服务器端获得List 的客户,你应该这样写你的Controller

    [HttpPost]
    public JsonResult OnChange(int id)
    {
        return Json(db.Customers.Where(C => C.CustomerID == id).ToList());
    }
    

    在客户端,如果您想使用IEnumerable 结果,您应该像这样更改您的 ajax 代码:

         $.ajax({
            type: "POST",
            url: '@Url.Action("OnChange", "Session")',
            data: { id: 1 },
            dataType: "json",
            success: function (success) {
            alert('Success');
            console.log(success);
            $.each(success, function (i, item) {
               $(".form-horizontal").append("<li>" + item.CustomerID  + "</li>");                                              
               }); 
            },
            error: function (e, text, string) {
                alert(e.message + text + string);
                console.log(e);
            }
        });
    

    我希望你的 OnChange 方法在 Session Controller 中。如您所知,您可以像这样 (item.CustomerID) 访问列表元素的其他属性。

    【讨论】:

    • 代码似乎可以工作,但我的 Json 数据有问题。我收到 500 响应,此错误出现在控制台的响应中:无效的 json 原语:id
    • 实际上你的$.ajax 方法是一团糟......我添加了所有更正来回答。所以你应该使用dataType: 'json'url 应该将数据发送到你的控制器方法。
    • 现在我收到了syntaxerror unexpected token s,但我不知道为什么会收到这个回复是:"SELECT [Extent1].[CustomerID] AS [CustomerID], [Extent1].[Name] AS [Name], [Extent1].[Customer_CustomerID] AS [Customer_CustomerID] FROM [dbo].[Customer] AS [Extent1] WHERE [Extent1].[CustomerID] = @p__linq__0"
    • 由于某种原因 ASP.NET 不允许我返回任何类型的数据库数据 Uncaught TypeError: Cannot use 'in' operator to search for '64' in System.Collections.Generic.List1[ProduktWebKort.Models.Customer]`
    • 你应该修改方法签名以返回一个ActionResult,并添加return Json(db.Customers.Where(C =&gt; C.CustomerID == id).ToList());as in this question
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多