我的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");
}
答案 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);
}
这样只会进行一次通话。
希望它有所帮助。