MVC控制器在页面加载时被击中两次

时间:2013-12-12 23:28:10

标签: javascript jquery asp.net-mvc html-helper

我的MVC控制器在页面加载时被击中两次,我对如何解决这个问题感到困惑。

我在布局页面中使用了navigator.geolocation.getCurrentPosition,并将纬度和经度传递给我的控制器。

我在div中有RenderAction,以防用户禁用JavaScript,因为有些人仍然使用 : - (

这是造成我问题的原因:
RenderAction将被渲染为1st并击中控制器。然后,AJAX请求被触发并命中控制器。

所以我的控制器每次请求都会被击中两次。

是否有一些我不知道的东西会阻止它,因为此刻,我所能想到的就是从页面中删除渲染动作。

代码:

<div class="dvWeather">
    @{ Html.RenderAction("PvCurrentWeatherConditions", "Weather"); }
</div> 

if (navigator.geolocation) {
    // alert("Geo-Enabled");
    navigator.geolocation.getCurrentPosition(showPosition, showError);
}

function showPosition(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var aj = "gl";

    $.ajax({
        url: '@Url.Action("PvCurrentWeatherConditions", "Weather")',
        type: 'get',
        data: {
            lat: lat,
            lon: lon,
            aj: aj
        },
        success: function (result) {
            $('.dvWeather').html(result);
        }
    });
}

public PartialViewResult PvCurrentWeatherConditions(string lat, string lon, string aj)
{

    if (Request.IsAjaxRequest())
    {
        try
        {
            //TODO create Viewmodel
            GeoCoordinate gc = new GeoCoordinate();
            var latitude = gc.Latitude = Convert.ToDouble(lat);
            var longitude = gc.Longitude = Convert.ToDouble(lon);
            string latlon = latitude + "," + longitude;
            var displayCurrentConditions = _igcc.CurrentConditions(latlon);
            return PartialView("pvCurrentWeatherConditions");
        }
        catch (FormatException)
        {
            //TODO get ip address
            return PartialView("pvLocationBasedOnIpAddress");
        }
        catch (Exception)
        {
            return PartialView("pvError");
        }
    }
    return PartialView("pvLocationBasedOnIpAddress");
}

2 个答案:

答案 0 :(得分:1)

也许使用另一种方法来检查访问者是否禁用了javascript,如noscript:

<noscript>
    <meta http-equiv="refresh" content="[URL]?java=off">
</noscript>

然后在新动作中处理查询字符串。

答案 1 :(得分:1)

您不必删除“渲染”操作。只需在div中进行另一次(否定)检查:

<div class="dvWeather">
<script type="text/javascript>
    //if (!navigator.geolocation) { : Edit
      if (navigator.geolocation == null) {
        @{ Html.RenderAction("PvCurrentWeatherConditions", "Weather"); }
    }
</script>
</div> 

编辑:

if (navigator.geolocation != null) {
            // alert("Geo-Enabled");
            navigator.geolocation.getCurrentPosition(showPosition, showError);
        }

这样只会进行一次通话。

希望它有所帮助。