【问题标题】:Passing data from asp.net MVC controller to the View via Ajax call通过 Ajax 调用将数据从 asp.net MVC 控制器传递到视图
【发布时间】:2017-11-30 22:00:06
【问题描述】:

大家好,我在 ajax 方面遇到了一些问题,我试图了解发生了什么。好吧,我得到了这个控制器,它返回了 Guider 模型的列表,这是我的控制器:

[HttpGet]
        public JsonResult ShowGuiders(string latitude, string longitude)
        {
            double lat = DataTypeConvert.ConvertToDouble(latitude);
            double lon = DataTypeConvert.ConvertToDouble(longitude);
            GeoCoordinate geoCoordinateFrom = new GeoCoordinate(lat, lon);

            var nearbyGuiders = (from guider in db.Guiders.AsEnumerable()
                                 let distance = geoCoordinateFrom.GetDistanceTo(new GeoCoordinate(guider.Latitude.Value, guider.Longitude.Value))
                                 where distance <= 100000
                                 orderby distance ascending
                                 select guider).ToList();
            return Json(nearbyGuiders, JsonRequestBehavior.AllowGet);

        }

这是我的脚本:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#btnGet").click(function () {
                var coordinate = {
                    "Latitude": $("#latitude").val(),
                    "Longitude": $("#longitude").val()
                };
                $.ajax({
                    type: 'GET',
                    url: '@Url.Action("ShowGuiders", "Guider")',
                    data: { latitude: coordinate.Latitude, longitude: coordinate.Longitude },
                    dataType: "json",
                    contentType: "application/json;charset=utf-8",
                    success: function (result) {
                        // Result
                        alert("Succes");
                    },
                    error: function (response) {
                        //do your own thing
                        alert("fail");
                    }
                });
            }); //end .submit()
        });
    </script>

最后是我的 Guider 模型:

public class Guider
    {
        [Key]
        [ForeignKey("ApplicationUser")]
        public string GuiderID { get; set; }
        //code...
        public double? Latitude { get; set; }
        public double? Longitude { get; set; }
        public bool IsAccepted { get; set; }

        [ForeignKey("CancellationPolicy")]
        public int? CancellationPolicyID { get; set; }

        [ForeignKey("Premium")]
        public int? PremiumID { get; set; }

        public virtual Premium Premium { get; set; }
        public virtual CancellationPolicy CancellationPolicy { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }

        public virtual ICollection<UnavailableDate> UnavailableDates { get; set; }

    }

问题是,每当我试图返回 Guider 列表时,什么都没有发生,并且 ajax 的错误函数事件正在引发。所以我试图只返回一个向导对象,并且一切工作正常。 该控制器工作正常:

[HttpGet]
        public JsonResult ShowGuiders(string latitude, string longitude)
        {

            myGuider.Country = "Greece";
            return Json(myGuider, JsonRequestBehavior.AllowGet);

        }

所以我发现 Json 不支持我的对象层次结构。所以我用匿名对象解决了我的问题。我像这样修改了控制器,并返回了我需要的属性:

[HttpGet]
        public JsonResult ShowGuiders(string latitude, string longitude)
        {
            double lat = DataTypeConvert.ConvertToDouble(latitude);
            double lon = DataTypeConvert.ConvertToDouble(longitude);
            GeoCoordinate geoCoordinateFrom = new GeoCoordinate(lat, lon);

            var nearbyGuiders = (from guider in db.Guiders.AsEnumerable()
                                 let distance = geoCoordinateFrom.GetDistanceTo(new GeoCoordinate(guider.Latitude.Value, guider.Longitude.Value))
                                 where distance <= 100000
                                 orderby distance ascending
                                 select new { country = guider.Country } ).ToList();
            return Json(nearbyGuiders, JsonRequestBehavior.AllowGet);

        }

【问题讨论】:

  • 请贴出代码sn-ps,不要截图。另外,请在回复中提供您收到的具体错误。您是否能够逐步执行控制器操作? javascript怎么样?
  • 删除contentType: "application/json;charset=utf-8",(您没有对数据进行字符串化 - 即使用data: JSON.stringify({ ... }),,因此您需要使用默认的'application/x-www-form-urlencoded; charset=UTF-8')。如果您发送的值是 double 类型的值,则将参数设置为 double latitude, double longitude 并让 DefaultModelBinder 完成其工作,而不是自己转换它们
  • @StephenMuecke 是的,你是对的,但我会修改它,我仍然会使用字符串来表示纬度和经度,因为如果我在文本框中写了 latitude = 40.664547177624414 效果很好,但如果我错误地写了 latitude = 40 ,664547177624414(带逗号)那么就有问题了。所以我更喜欢保留它们的字符串并手动修改它们。
  • 那么这将是基于服务器文化的无效值,因此正确的方法是在客户端(和服务器)上捕获错误并显示错误消息(并考虑如果用户输入40.66Lat - 您的代码可能只会抛出异常)。始终验证您的数据。

标签: jquery ajax asp.net-mvc controller


【解决方案1】:

$("#btnGet").click(function () 
{
    var coordinate = {
        "Latitude": $("#latitude").val(),
        "Longitude": $("#longitude").val()
    };
    $.ajax({
             type: 'GET',
             url: '@Url.Action("ShowGuiders", "Guider")',
             data: { 
                      latitude: coordinate.Latitude, 
                      longitude:coordinate.Longitude 
             },
             success: function (result) {
                        // Result
                        alert("Succes");
             },
             error: function (response) {
                        //do your own thing
                        alert("fail");
             }
   });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多