0

VS2010WebアプリケーションでASP.NETWebApi CRUD操作を作成しようとしましたが、結果がソーステーブルからすべての行を返さないのはなぜですか。

これは私のコードです:

ルート/Globax.asax

protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.MapHttpRoute(
            name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", // browse with localhost:7031/api/product
                //routeTemplate: "{controller}/{id}",  // browse with localhost:7031/product
                 defaults: new { id = System.Web.Http.RouteParameter.Optional }
      );

Controller / ProductController.cs:

    public class ProductController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();

        public List<Product> GetAll()
        {
            return db.Products.ToList<Product>();// ;
        }

View / ViewProduct.aspx:

    <script src="Script/jquery-1.7.1.min.js" type="text/javascript"></script>

<script type="text/javascript">
    $(function () {
        $('#<%= cviewproduct.ClientID %>').click(function (e) {
            getProducts();
            e.preventDefault();
        });

    });

    function getProducts() {
        $.getJSON("/api/product",
                function (data) {
                    $.each(data, function (key, val) {
                        //var str = val.ProductName;
                        // alert(str);

                        var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>';

                        $(row).appendTo($('#tblproduct'));


                    });
                });
    }
</script>

以下は、「 http:// localhost:7031 / api / product 」を介した製品コントローラーの結果です:

ここに画像の説明を入力してください

以下はgetProducts()関数の結果です:

ここに画像の説明を入力してください

私を助けてください。

何かアイデアや提案はありますか?

4

3 に答える 3

1

を実行する$.getJSON("/api/product", ...と、投稿したとおりの XML が返されません。JSON を取得しています。

最初のステップとして、 Fiddler2をダウンロードしてインストールすることをお勧めします。それを開き、Composer タブを使用して GET を実行しますhttp://localhost:7031/api/product。返された JSON が表示されますが、これは XML とは異なります。その JSON を元の質問に投稿してください。さらにサポートできるはずです。

私の推測では、JSON が適切にフォーマットされていません。WebApiConfig.cs クラスはどのように見えますか?

アップデート

はい、もっと良い方法があります。まず、ApiModel を作成します (WebAPI に対する ApiModel は、MVC に対する ViewModel と同じです)。

public class ProductApiModel
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
}

ここで、コントローラーからのエンティティの代わりにこれを返します。

public class ProductController : ApiController
{
    public IEnumerable<ProductApiModel> GetAll()
    {
        var products = db.Products
            .OrderBy(x => x.ProductID)
            .Select(x => new ProductApiModel
            {
                ProductId = x.ProductID,
                ProductName = x.ProductName
            });
        return products;
    }
}

AutoMapperを使用した場合、コントローラーのコードを少し短くすることができます。

public class ProductController : ApiController
{
    public IEnumerable<ProductApiModel> GetAll()
    {
        var entities = db.Products.OrderBy(x => x.ProductID);
        var models = Mapper.Map<ProductApiModel[]>(entities);
        return models;
    }
}
于 2013-01-08T16:07:45.253 に答える
0

いくつかの調査を行った後、私は最終的に見つけました(間違っている場合は訂正してください):JavaScriptSerializerは、エンティティと他のエンティティ(ProductおよびCatagory)間の関係からオブジェクトツリー全体をシリアル化できませんでした。

だから..私は私のコードにいくつかの変更を加えました、そして結果は期待通りです


Controller / ProductController.cs:

から :

public class ProductController : ApiController
{
    NorthwindEntities db = new NorthwindEntities();

    public List<Product> GetAll()
    {
        return db.Products.ToList<Product>();// ;
    }

に :

public class ProductController : ApiController
{

   public string GetAll()
    {
        var product = db.Products.OrderBy(x => x.ProductID).Select(x => new
                     {
                         ProductId = x.ProductID,
                         ProductName = x.ProductName
                     });
        return JsonConvert.SerializeObject(product);
    }

View / ViewProduct.aspx:

から :

function getProducts() {
        $.getJSON("/api/product",
                function (data) {
                    $.each(data, function (key, val) {
                        var row = '<tr> <td>' + val.ProductName 
            + '</td><td>' + val.ProductID + '</td><tr/>';
                        $(row).appendTo($('#tblproduct'));

                    });
                });

に :

$.getJSON("/api/product",
                function (data) {
                    var obj = $.parseJSON(data);
                    $.each(obj, function (key, val) {
                        var row = '<tr> <td>' + val.ProductId 
        + '</td><td>' + val.ProductName + '</td><tr/>';
                        $(row).appendTo($('#tblproduct'));
                    });
                });

または...これよりも良い方法はありますか、

それでも文字列オブジェクトの代わりにエンティティオブジェクトを渡したい場合(List GetAll()...代わりにGetAll string()....)

よろしく、

アンドリアン

于 2013-01-15T04:06:30.800 に答える
0

だから..これが私の最終的な作業コード

モデル:

名前空間 MyLabs1.Models

{
    public class ProductApi
    {
        [Key]
        public Int32 ProductID { get; set; }
        public string ProductName { get; set; }
    }
}

コントローラ/ProductController.cs:

public IEnumerable<ProductApi> getall()
    {
        Mapper.CreateMap<Product, ProductApi>();
        var entities = db.Products.OrderBy(x => x.ProductID).ToList();
        var models = Mapper.Map<ProductApi[]>(entities);
        return models;
    }

また

public List<ProductApi> GetAll()
{
    var products = db.Products
        .OrderBy(x => x.ProductID)
        .Select(x => new ProductApi
        {
            ProductID = x.ProductID,
            ProductName = x.ProductName
        }).ToList();
    return products;
}

View/ViewProduct.aspx :

function getProducts() {
    $.getJSON("/api/product",
            function (data) {
                $.each(data, function (key, val) {
                    var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>';
                    $(row).appendTo($('#tblproduct'));
                });
            });
   }

これが他の人に役立つことを願っています

よろしく、

アンドリアン

于 2013-01-30T07:42:42.237 に答える