2017-09-26 2 views
0

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>"; 

エラーは、このために

Uncaught SyntaxError: Unexpected token }

以下の理由が引用符です。 onclickメソッドにはquatoがあり、onclick関数のパラメータに文字列のためのquatoもあります。私はたくさん試しましたが、解決策を見つけることができませんでした。 この問題を解決するにはどうすればよいですか?

ありがとうございます。

答えて

0

以下は、カテゴリ名引数の二重引用符のため、修正されています。 関数の文字列をhtmlで終了します。

一重引用符で入力することができます。

ShowCategory(" + category.Id + ",'"+ category.Name + "') 

最終的なコードは次のようになります。

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>"; 
+0

私が試したが、働いていません。 –

0

double quotes内部single 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>"; 
+0

私は試しましたが、うまくいきませんでした。 –

0

これはあなたの質問に本当に答えるつもりはありませんが、これを解決するためにはるかに優れたクリーナーテクニックがあります。このようなコードを維持するのは本当に難しく、エラーに陥るのは簡単すぎます。引用符で囲まれたすべてのエスケープを含むコードは大きな混乱です。 "Display Templates"、 "Helper Methods"やその他のテンプレートテクニックを使用しても、これはどのようにきれいに見えるはずです。さらにstring.Format()と "文字列補間"(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> 
     } 
    } 
} 

、無引用エスケープ、あなたは単にレイザー構文で変数を使用してHTMLを補間することができます。あなたの名前にHtml出力の破損を防ぐために特殊文字(テキスト内の引用符など)が含まれている場合は、HttpUtility.JavaScriptStringEncodeを使用してください。

ヘルパーWriteRootRowHtmlは、ビュー内@WriteRootRowHtml(...)を使用して直接実行することができ、それが表示する出力しますが、あなただけのさらなる処理のための文字列をしたい場合は、あなたが行うことができます:

@{ 
    var generatedHtml = WriteRootRowHtml(...).ToHtmlString(); 
} 
関連する問題