将MVC4 Web API应用程序转换为Phonegap Android应用程序

时间:2014-02-10 06:39:11

标签: javascript html asp.net-mvc-4 cordova asp.net-web-api

我有一个MVC4 Web API应用程序,我有我的Api控制器和Code-First EF5数据库以及一些JavaScript函数,用于我的应用程序的功能,包括我的Web Api服务的Ajax调用。我在MVC做了项目,因为我在VS2012安装Cordova时遇到问题,所以我决定使用Eclipse / Android Phonegap平台。有一种方法可以调用我的web api服务,并能够在我的Android Phonegap应用程序中检索我设计的EF5(MVC4)数据库数据没有必要从头开始同样的事情。我知道phonegap基本上是Html(JavaScript和Css),但我使用相同的HTML标记我使用MVC4调用我的服务有困难。我是初学者请告诉我,如果我正在做的事情是可能的,如果没有,请告诉我如何能够解决这个问题。 T * 他是我的Html代码 *

<script type="text/javascript" charset="utf-8" src="phonegap-2.9.0.js"></script>
<script type="text/javascript" charset="utf-8" src="barcodescanner.js"></script> 
<script type="text/javascript" language="javascript" src="http://api.afrigis.co.za/loadjsapi/?key=...&version=2.6">
</script>
<script type="text/javascript" language="javascript">


// Wait for device API libraries to load
//
document.addEventListener("deviceready", onDeviceReady, false);

//initialize watchID Variable

var watchID = null;
// device APIs are available

function onDeviceReady() {
    // Throw an error if no update is received every 30 seconds
    var options = { timeout: 30000 };
    watchID = navigator.geolocation.watchPosition(onSuccess, onError, options);

    // onSuccess Geolocation
//
function onSuccess(position) {
    var element = document.getElementById('geolocation');
    element.innerHTML = 'Latitude: '  + position.coords.latitude      + '<br />' +
                        'Longitude: ' + position.coords.longitude     + '<br />' +
                        '<hr />'      + element.innerHTML;
}

    // onError Callback receives a PositionError object
    //
    function onError(error) {
        alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n');
    }

}
    //declare a global map object
    var agmap = null;

    // declare zoom control of map
    var zoomCtrl = null;
    function initAGMap() {

        agmap = new AGMap(document.getElementById("MapPanel"));
         //TODO: must retrieve coords by device location not hard corded.

        agmap.centreAndScale(new AGCoord(-25.7482681540537, 28.225935184269), 5); // zoom level 5 heres
        // making zoom controls for map
        var ctrlPos = new AGControlPosition(new AGPoint(10, 10), AGAnchor.TOP_LEFT);
        zoomCtrl = new AGZoomControl(1);
        agmap.addControl(zoomCtrl, ctrlPos);
    }

    function removeZoomCtrl()
    {
        zoomCtrl.remove();
    }

    //function search() {
    //    var lat = $('#latitude').val();
    //    var long = $('#longitude').val();

    //    $.ajax({
    //        url: "api/Attractions/?longitude=" + long + "&latitude=" + lat,
    //        type: "GET",
    //        success: function (data) {
    //            if (data == null) {
    //                $('#attractionName').html("No attractions to search");
    //            }
    //            else {
    //                $('#attractionName').html("You should visit " + data.Name);
    //                displayMap(data.Location.Geography.WellKnownText, data.Name);
    //            }

    //        }

    //    });

    //}

    //function GetCoordinate() {
        //todo: get details from cordova, currently mocking up results
       //return { latitude: -25.5, longitude: 28.5 };
    }
    function ShowCoordinate(coords) {
        agmap.centreAndScale(new AGCoord(coords.latitude, coords.longitude), 5); // zoom level 5 here
        var coord = new AGCoord(coords.latitude, coords.longitude);
        var oMarker = new AGMarker(coord);
        agmap.addOverlay(oMarker);
        oMarker.show();

        //todo: create a list of places found and display with marker on AfriGIS Map.
    }

    function ScanProduct()
    {
        //todo retrieve id from cordova as mockup
        //This is mockup barcode 
        //return "1234";
        //sample code using cordova barcodescanner plugin
                  var scanner = cordova.require("cordova/plugin/BarcodeScanner");
                  scanner.scan(
                  function (result) {
                  alert("We got a barcode\n" +
                  "Result: " + result.text + "\n" +
                  "Format: " + result.format + "\n" +
                  "Cancelled: " + result.cancelled);
            },

       //Callback function if barcodedont exist

            function (error) {
                alert("Scanning failed: " + error);
            });
    }
    //Function to display Success or error in encoding.

     function encode(type, data) {
        window.plugins.barcodeScanner.encode(type, data, function(result) {
               alert("encode success: " + result);
            }, function(error) {
                 alert("encoding failed: " + error);
            });}



    function GetProductDetails(barcodeId,coords) 
    {
        //Ajax Call to my web Api service 
        $.getJSON("api/products/?barcodeId=" + barcodeId + "&latitude=" + coords.latitude + "&longitude=" + coords.longitude)
          .done(function (data) {
              $('#result').append(data.message)
              console.log(data)
              var list = $("#result").append('<ul></ul>').find('ul');
              $.each(data.results, function (i, item)
              {
                   if (data.results == null) {

                      $('#result').append(data.message)
                  }

                  else {


                      list.append('<li>ShopName :' + item.retailerName + '</li>');
                      list.append('<li>Name : ' + item.productName + '</li>');
                      list.append('<li>Rand :' + item.price + '</li>');
                      list.append('<li>Distance in Km :' + item.Distance + '</li>');

                      //Another Solution 

                      //var ul = $("<ul></ul>")
                      //ul.append("<li> Rand" + data.results.productName + "</li>");
                      //ul.append("<li> Rand" + data.results.Retailer.Name + "</li>");
                      //ul.append("<li> Rand" + data.results.price + "</li>");
                      //ul.append("<li> Rand" + data.results.Distance + "</li>");
                      //$("#result").append(ul);
                  }

              });

              $("#result").append(ul);

          });
        }

    function ShowProductDetails()
    {
        //todo: display product details  
        //return productdetails.barcodeId + productdetails.retailerName + ': R' + productdetails.Price + productdetails.Distance;
    }
        //loading javascript api
        $(function () {
            initAGMap();

            var coord = GetCoordinate();
            ShowCoordinate(coord);
            var barcodeId = ScanProduct();
            var productdetails = GetProductDetails(barcodeId, coord);
            ShowProductDetails(productdetails);
        });
</script>

1 个答案:

答案 0 :(得分:0)

看起来你走在正确的轨道上。现在显而易见的错误是它使用相对URL(api/products/?barcodeId=)来调用Web API。因为HTML不再与Web API在同一服务器上托管(即使您可能仍然在本地计算机上运行它们),这将不再起作用。您需要使用绝对URL调用服务(例如,http://localhost:8888/api/products/?barcodeId=)。

您的Web API目前在哪里托管?您如何运行Cordova代码?如果Web API在本地计算机上启动并运行,并且您的Cordova应用程序在同一台计算机上的模拟器上运行,则应该能够通过提供其完整的localhost路径来调用该服务。

如果它仍然不起作用,您需要以某种方式调试代码并查看错误。