【问题标题】:how to use jquery with razor syntax in asp.net mvc 5?如何在 asp.net mvc 5 中使用带有剃刀语法的 jquery?
【发布时间】:2016-03-07 23:08:23
【问题描述】:

我需要使用 jQuery 来动态添加一些元素。所以我在互联网上查找,我发现this. 当单引号内有纯 html 元素时,它很好并且工作。我需要在 jQuery 中使用剃刀语法。

我知道 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 - 动态添加元素。在这里,我在单击按钮时添加标签和下拉列表。我如何实现这一目标?

【问题讨论】:

  • 您的浏览器开发者工具是否有任何错误?
  • 参考答案herehere 了解动态添加收藏项的一些选项
  • 这是一个非常糟糕的主意,原因有很多。而是使用 Razor 生成 HTML 的模板化 sn-p(隐藏在 DOM 中)并使用 jQuery 复制它。
  • @Zaki 它是 chrome 的开发者工具中的“未识别符号”...
  • @TrueBlueAussie 看起来很有希望。我怎么做?任何文档/tuts/链接....谢谢...

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


【解决方案1】:

最好避免使用 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),并为需要重命名的各种属性使用占位符。

例如

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

【讨论】:

  • 所以,这些天应该如何解决这个问题,我想知道在我的剃须刀网站上使用什么客户端代码、香草 js、jquery angular、react、knout 我有点喜欢第一个的简单性两个
  • @ВиталийТерзиев:这取决于您希望使用哪个堆栈。如果您使用 Angular,您将不会在托管页面中注入太多任何内容,因为它都是通过服务调用由数据驱动的客户端脚本。你能提供一个你想注入的例子吗?
  • 实际上我想知道我是否可以跳过 Angular,使用 Razor 和足够的 JS,例如淘汰赛或 jquery,这是一个简单的公司网站,我只想看起来不错,想知道这是否是不好的做法
  • @ВиталийТерзиев:很多公司都在推动使用 Angular 等客户端框架,但无形的开销(适当的测试)很大。我自己,我在 MVC 之上添加了 JS 插件层,以便它像 Angular 一样运行(但热量只有一半):)
  • 是的,谢谢你的回答,我想我会试一试,看看效果如何 :) 希望我能用几个 js 函数过关(这个网站真的很简单,我的目标是流畅、快速的体验,毕竟该网站将销售网络应用程序、网站和电子商务(这会有点困难,但 nppcommerce 似乎非常好:))
【解决方案2】:

您可以在 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>

【讨论】:

    【解决方案3】:

    您不能使用 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());
    

    【讨论】:

    • 是否有任何可用的文档/示例/链接?我是 asp.net 的新手。
    • 对我来说,这行得通。使用局部视图的想法也很有吸引力。
    猜你喜欢
    • 2011-04-12
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2015-10-25
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多