它是可能的,或有一个工作区,以使用Razor语法在JavaScript中,是在一个视图(cshtml)?

我正在尝试添加标记到谷歌地图…例如,我尝试了这个,但我得到了大量的编译错误:

<script type="text/javascript">

    // Some JavaScript code here to display map, etc.

    // Now add markers
    @foreach (var item in Model) {

        var markerlatLng = new google.maps.LatLng(@(Model.Latitude), @(Model.Longitude));
        var title = '@(Model.Title)';
        var description = '@(Model.Description)';
        var contentString = '<h3>' + title + '</h3>' + '<p>' + description + '</p>'

        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });

        var marker = new google.maps.Marker({
            position: latLng,
            title: title,
            map: map,
            draggable: false
        });

        google.maps.event.addListener(marker, 'click', function () {
            infowindow.open(map, marker);
        });
    }
</script>

当前回答

我终于找到了解决方案(*.vbhtml):

function razorsyntax() {
    /* Double */
    @(MvcHtmlString.Create("var szam =" & mydoublevariable & ";"))
    alert(szam);

    /* String */
    var str = '@stringvariable';
    alert(str);
}

其他回答

只要它在CSHTML页面中,而不是外部JavaScript文件中,就可以正常工作。

Razor模板引擎不关心输出什么,也不区分<script>或其他标记。

但是,您需要对字符串进行编码以防止XSS攻击。

你是想把方钉塞进圆洞里。

Razor的目的是作为一种html生成模板语言。您可以让它生成JavaScript代码,但它不是为此而设计的。

例如:What if Model。标题包含撇号?这将破坏JavaScript代码,默认情况下Razor不会正确转义它。

在辅助函数中使用String生成器可能更合适。这种做法可能会减少意想不到的后果。

一个简单明了的例子:

<script>
    // This gets the username from the Razor engine and puts it
    // in JavaScript to create a variable I can access from the
    // client side.
    //
    // It's an odd workaraound, but it works.
    @{
        var outScript = "var razorUserName = " + "\"" + @User.Identity.Name + "\"";
    }
    @MvcHtmlString.Create(outScript);
</script>

这将在您的页面中创建一个脚本,在您放置上面的代码的位置,看起来如下所示:

<script>
    // This gets the username from the Razor engine and puts it
    // in JavaScript to create a variable I can access from
    // client side.
    //
    // It's an odd workaraound, but it works.

    var razorUserName = "daylight";
</script>

现在您有了一个全局JavaScript变量razorUserName,您可以在客户机上访问和使用它。Razor引擎显然已经从@User.Identity中提取了这个值。名称(服务器端变量),并将其放入它写入脚本标记的代码中。

在我看来,下面的解决方案似乎比将JavaScript与Razor结合起来更准确。看看这个: https://github.com/brooklynDev/NGon

你可以向ViewBag中添加几乎任何复杂的数据。Ngon并在JavaScript中访问它

在控制器中:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var person = new Person { FirstName = "John", LastName = "Doe", Age = 30 };
        ViewBag.NGon.Person = person;
        return View();
    }
}

在JavaScript中:

<script type="text/javascript">
    $(function () {
        $("#button").click(function () {
            var person = ngon.Person;
            var div = $("#output");
            div.html('');
            div.append("FirstName: " + person.FirstName);
            div.append(", LastName: " + person.LastName);
            div.append(", Age: " + person.Age);
        });
    });
</script>

它允许使用默认的JavascriptSerializer序列化任何普通的旧CLR对象(POCOs)。

那些像我这样没有Json的人。编码可用,可以尝试这一点。

<script type="text/javascript">
    var model = @Html.Raw(Json.Serialize(Model))
</script>