no9
no9

Reputation: 6544

Using razor in javascript

Can someone please explain my possible options when trying to get razor data inside javascript? I am trying to add markers to google map.

This seems to work:

@model IEnumerable<ServicesPortal.Models.MapsPartialModel>
@{
    ViewBag.Title = "Home Page";
}

@if (Model != null)
{
    <script type="text/javascript"  src="http://maps.googleapis.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
    function initialize() {
        var mapOptions = {
            center: new google.maps.LatLng(46.119944, 14.815333),
            zoom: 5,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map"), mapOptions);

        addmarker(46.119944, 14.815333);
        // and so on...

        function addMarker(x, y) {
            var location = new google.maps.LatLng(x, y);
            var marker = new google.maps.Marker({
                position: location,
                map: map,
            });
        }
    } google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    <div id="map" style="width:auto; height:500px"></div>
}

While this does not:

@model IEnumerable<ServicesPortal.Models.MapsPartialModel>
@{
    ViewBag.Title = "Home Page";
}

@if (Model != null)
{
    <script type="text/javascript"  src="http://maps.googleapis.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
    function initialize() {
        var mapOptions = {
            center: new google.maps.LatLng(46.119944, 14.815333),
            zoom: 5,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map"), mapOptions);

        @foreach (var item in Model)
        {
            <text>
                addMarker(@item.Profile.lat, @item.Profile.lng);
            </text>
        }

        function addMarker(x, y) {
            var location = new google.maps.LatLng(x, y);
            var marker = new google.maps.Marker({
                position: location,
                map: map,
            });
        }
    } google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    <div id="map" style="width:auto; height:500px"></div>
}

EDIT: This is also not working...

@model IEnumerable<ServicesPortal.Models.MapsPartialModel>
@{
    ViewBag.Title = "Home Page";
}

@if (Model != null)
{
    <script type="text/javascript"  src="http://maps.googleapis.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
    function initialize() {
        var mapOptions = {
            center: new google.maps.LatLng(46.119944, 14.815333),
            zoom: 5,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map"), mapOptions);

        @foreach (var item in Model)
        {
            <text>
               addMarker(@Html.Raw(item.Profile.lat), @Html.Raw(item.Profile.lng));
            </text>
        }

        function addMarker(x, y) {
            var location = new google.maps.LatLng(x, y);
            var marker = new google.maps.Marker({
                position: location,
                map: map,
            });
        }
    } google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    <div id="map" style="width:auto; height:500px"></div>
}

EDIT: Tried also with some variables ... no effect.

@model IEnumerable<ServicesPortal.Models.MapsPartialModel>
@{
    ViewBag.Title = "Home Page";
}

@if (Model != null)
{
    <script type="text/javascript"  src="http://maps.googleapis.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
    function initialize() {
        var mapOptions = {
            center: new google.maps.LatLng(46.119944, 14.815333),
            zoom: 5,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map"), mapOptions);

        // test
        var lat = 46.119944;
        var lng = 14,815333;

        @foreach (var item in Model)
        {
           <text>
              addMarker(@lat, @lng);
           </text>
        }

        function addMarker(x, y) {
            var location = new google.maps.LatLng(x, y);
            var marker = new google.maps.Marker({
                position: location,
                map: map,
            });
        }
    } google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    <div id="map" style="width:auto; height:500px"></div>
}

I was trying to use this solution, but I am missing something... Using Razor within JavaScript

Upvotes: 1

Views: 3916

Answers (3)

pinyil
pinyil

Reputation: 77

I used Html.Raw to get markers and then put markers' lat, lng and some information inside 'locations'.

var locations = [
        @(Html.Raw("{" + string.Join("},{", Model.MarkersOfPlace.Select(m=> "lat:" + (m.Latitude).ToString().Replace(',', '.') + ",lng:" + (m.Longtitude).ToString().Replace(',', '.') + ",id:" + m.Id + ",placeName:'" + m.Name +  "'")) + "}" ))
    ]

I created an array of markers based on given locations array.

var markers = locations.map(function (location, i) {
            var marker = new google.maps.Marker({
                position: {lat: location.lat, lng: location.lng},
                id:location.id,
                title: location.placeName,
                clickable: true
            });
            marker.addListener('click', function() {
                //when clicked, do sth
            });
            return marker;
        });

Upvotes: 0

Arezoo mansouri
Arezoo mansouri

Reputation: 1

    @model IEnumerable<Advertise.ViewModel.Models.Address.AddressViewModel>

    <style>
        #markerClusterMapCanvas {
            height: 100%;
            width: 100%;
        }

    </style>

<div id="markerClusterMapCanvas"></div>
@if (Model != null)
{
    <script>
        var map;
        var locationMap = [];

        function initMapMarkerCluster() {

             map = new google.maps.Map(document.getElementById('markerClusterMapCanvas'),
            {
                zoom: 10,
                center: { lat: 35.6988196, lng: 51.3924643 }
            });

            var markers = locationMap.map(function(location, i) {
                return new google.maps.Marker({
                    position: location
                });
            });

            var markerCluster = new MarkerClusterer(map,
                markers,
                { imagePath: '/Content/GoogleMap/m' });





        }

@foreach (var item in Model)
            {
                <text>
                    addMarker(@item.Latitude, @item.Longitude);
                </text>
            }
        function addMarker(x, y) {
            locationMap.push({lat: x, lng: y});
        }
    </script>
    <script src="~/Scripts/GoogleMap/markerclusterer.js"></script>

    <script async defer
            src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCNquRLkvpmnKcTnyLvCIxt1oh-HRiQiMg&callback=initMapMarkerCluster">
    </script>
}

Upvotes: 0

Andrei V
Andrei V

Reputation: 7508

Your values contain a dot and Razor, in its brightness, interprets that as an object.property. Try using Html.Raw():

<text>addMarker(@Html.Raw(item.Profile.lat), @Html.Raw(item.Profile.lng));</text>

Upvotes: 2

Related Questions