如何在asp.net mvc 5中使用带有razor语法的jquery?

时间:2015-12-03 11:01:15

标签: javascript jquery asp.net asp.net-mvc razor

我需要使用jQuery动态添加一些元素。所以我在互联网上查找了this.当单引号中有简单的html元素时,它很好用。我需要在jQuery中使用razor语法。

据我所知,jQuery是用户端,razor是服务器端。它们不能组合在一起。我在这里问,因为我需要知道如何实现这一点。

我没有工作的jQuery如下:

<script type="text/javascript">  
    $(document).ready(function () {  
        $(document).on("click", ".btnPlus", function () { 
        var html = '<div class="form-group">'+
                '@Html.LabelFor(model => model.transaction_item, "transaction_item", htmlAttributes: new { @class = "control-label col-md-2" })'+ 

                '<div class="col-md-4">'+
                    '@Html.DropDownList("transaction_item", null, htmlAttributes: new { @class = "form-control" })'+
                    '@Html.ValidationMessageFor(model => model.transaction_item, "", new { @class = "text-danger" })'+
                '</div>'+

                '<div class="col-md-6"><input type="button" class="BtnPlus" value="+" /></div>'+

            '</div>'
        $("#trItem").append($(html))
    };
});

我的目标与tutorial类似 - 动态添加元素。在这里,我在点击按钮上添加标签和下拉列表。我该如何实现这一目标?

3 个答案:

答案 0 :(得分:4)

你不能使用JQuery添加Razor元素,因为正如你所说,JQuery是一个客户端库,而使用Razor语法的ASP.NET是服务器端脚本语言。

如果要添加使用Razor语法创建的元素,请在页面中添加一个隐藏元素,然后使用JQuery将clone添加到DOM中。

这样的事情可以让你知道我的意思:

@Html.DropDownList("transaction_item", null, htmlAttributes: new { @class = "form-control", @id = 'template-ddl' })

$("#trItem").append($('#template-ddl').clone());

答案 1 :(得分:4)

您可以在Views Shared文件夹中创建部分页面_MyPartial.cshtml

然后在您的视图引用中添加对脚本部分的引用

@section Scripts {
    @Html.Partial("~/Views/Shared/_MyPartial.cshtml",Model);
}

部分页面:_MyPartial.cshtml

@model MyViewModel

<script type="text/javascript">  
$(document).ready(function () {  
    $(document).on("click", ".btnPlus", function () { 
    var html = '<div class="form-group">'+
            '@(Html.LabelFor(model => model.transaction_item, "transaction_item", htmlAttributes: new { @class = "control-label col-md-2" }))'+ 

            '<div class="col-md-4">'+
                '@(Html.DropDownList("transaction_item", null, htmlAttributes: new { @class = "form-control" }))'+
                '@(Html.ValidationMessageFor(model => model.transaction_item, "", new { @class = "text-danger" }))'+
            '</div>'+

            '<div class="col-md-6"><input type="button" class="BtnPlus" value="+" /></div>'+

        '</div>'
    $("#trItem").append($(html))
};
</script>

答案 2 :(得分:3)

最好避免使用Razor生成jQuery / Javascript代码。出于多种原因,您的Javascript / jQuery代码在单独的文件中更好(VS调试/脚本捆绑等)

而是将模板化的HTML注入页面的隐藏部分。虚拟脚本块对此非常有用,因为浏览器将忽略未知的脚本类型:

<script id="template" type="text/template">  
    <div class="form-group">
        @Html.LabelFor(model => model.transaction_item, "transaction_item", htmlAttributes: new { @class = "control-label col-md-2" })    
        <div class="col-md-4">
            @Html.DropDownList("transaction_item", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.transaction_item, "", new { @class = "text-danger" })
        </div>
        <div class="col-md-6"><input type="button" class="BtnPlus" value="+" /></div>
    </div>
</script>

您可以查看DOM检查器生成的内容,以确保存在正确的属性。

然后只需使用模板中的HTML添加新按钮:

$("#trItem").append($('#template').html());

您需要解决的唯一问题是多个项目的重复ID和索引。我通常在模板中使用原始HTML(而不是Razor),并使用占位符来处理需要重命名的各种属性。

e.g。

<script id="template" type="text/template">  
    <div class="form-group">
        <label for="{id}"/>