mvc视图中的嵌套引号情况

时间:2017-09-26 13:25:24

标签: javascript c# asp.net-mvc

在视图中的MVC项目中,我试图使用下面的代码获取数据。我的问题是语法错误

@functions{

            string GetRootRowHtml(List<CORE.Models.Category> categories, int parentId)
            {
                string html = String.Empty;
                foreach (var category in categories.Where(c => c.ParentId == parentId))
                {
                    var childList = GetRootRowHtml(categories, category.Id);
                    var categoryHtml = "<li class=\"dd-item\" data-id=\"" + category.Id + "\" data-role=\"collapsible\" data-iconpos=\"left\" data-inset=\"false\">";
                    categoryHtml += "<div class=\"dd-handle dd-nodrag\">";
                    categoryHtml += "<div style=\"margin: 0 10px; width:25px; height:25px; float: left;\"></div>";
                    categoryHtml += "<span class=\"label label-info\"><i class=\"fa fa-arrows\" ></i></span>" + category.Name.Replace("'", @"\'") +
                                    "</div>" +
                                    "<span class=\"pull-right menu_process\">";
                    if (CORE.Models.User.IsAllowedTo(CORE.Models.User.AccessType.CATEGORY_UPDATE))
                    {
                        categoryHtml += "<button class=\"btn btn-primary btn-circle\" onClick=\"UpdateCategory(" + category.Id + ")\" style =\"margin-right:10px;\" type=\"button\" title =\"" + Resources.Resource.Edit + "\"> <i class=\"fa fa-edit\"></i></button>";
                        categoryHtml += "<button class=\"btn btn-success btn-circle\" onClick=\"ShowCategory(" + category.Id + ",\""+ category.Name + "\")\" style =\"margin-right:10px;\" type=\"button\" title =\"" + Resources.Resource.Edit + "\"> <i class=\"fa fa-list\"></i></button>";

                    }
                    html += categoryHtml;
                }
                return html;
            }

        }

上面的代码,我在下面的代码行中出现语法错误。

                categoryHtml += "<button class=\"btn btn-success btn-circle\" onClick=\"ShowCategory(" + category.Id + ",\""+ category.Name + "\")\" style =\"margin-right:10px;\" type=\"button\" title =\"" + Resources.Resource.Edit + "\"> <i class=\"fa fa-list\"></i></button>";

错误在

之下
  

未捕获的SyntaxError:意外的令牌}

原因是报价。在onclick方法中有一个quato,在onclick函数参数中还有另一个quato for string。我尝试了很多,但找不到解决方案。 我该如何解决这个问题?

提前致谢。

3 个答案:

答案 0 :(得分:0)

以下是更正,由于类别名称参数中的双引号,它 在html中终止函数字符串。

你可以把它放在单引号中。

categoryHtml += "<button class=\"btn btn-success btn-circle\" onClick=\"ShowCategory(" + category.Id + ",'"+ category.Name + "')\" style =\"margin-right:10px;\" type=\"button\" title =\"" + Resources.Resource.Edit + "\"> <i class=\"fa fa-list\"></i></button>";

所以最终代码应该如下所示。

single quotes

答案 1 :(得分:0)

double quotes内使用categoryHtml += "<button class='btn btn-success btn-circle' onclick='ShowCategory(" + category.Id + ", '"+ category.Name + "')' style ='margin-right:10px;' type='button' title ='" + Resources.Resource.Edit + '"> <i class='fa fa-list'></i></button>"; 。格式化起来要容易得多。

URL

答案 2 :(得分:0)

这不会真正回答你的问题,但有更好,更清洁的技术来解决这个问题。维护这样的代码真的很难,并且很容易遇到错误。所有报价转义的代码都是一大堆。您应该看到使用&#34;显示模板&#34;,&#34;帮助方法&#34;或其他模板技术,甚至是string.Format()和&#34;字符串插值&#34; (C#6+)做得更好。

我强烈建议重写使用辅助方法。 你可以像这样编写你的Html:

@helper WriteRootRowHtml(List<CORE.Models.Category> categories, int parentId) {
    foreach (var category in categories.Where(c => c.ParentId == parentId))
    {
        <li class="dd-item" data-id="@category.Id" data-role="collapsible" data-iconpos="left" data-inset="false">
        <div class="dd-handle dd-nodrag">
        <div style="margin: 0 10px; width:25px; height:25px; float: left;"></div>
        <span class="label label-info"><i class="fa fa-arrows" ></i></span> @(category.Name.Replace("'", @"\'"))
        </div>
        <span class="pull-right menu_process">

        @if (CORE.Models.User.IsAllowedTo(CORE.Models.User.AccessType.CATEGORY_UPDATE))
        {
            <button class="btn btn-primary btn-circle" onClick="UpdateCategory(@(category.Id))" style ="margin-right:10px;" type="button" title="@Resources.Resource.Edit">
              <i class="fa fa-edit"></i>
            </button>
            <button class="btn btn-success btn-circle" onClick="ShowCategory(@(category.Id), '@HttpUtility.JavaScriptStringEncode(category.Name)')" style ="margin-right:10px;"  type="button" title="@Resources.Resource.Edit">
              <i class="fa fa-list"></i>
            </button>
        }
    }
}

你看,没有引用转义,你可以简单地用Razor语法中的变量插入Html。如果您的名字可能包含一些特殊字符(如文本中的引号),请使用HttpUtility.JavaScriptStringEncode以防止破坏您的Html输出。

可以使用View中的WriteRootRowHtml直接执行帮助器@WriteRootRowHtml(...),它将输出到视图,但如果您只想要字符串进行进一步处理,则可以执行以下操作:

@{
    var generatedHtml = WriteRootRowHtml(...).ToHtmlString();
}