1

をタグ私は属性をルーティングしたいASP.NET MVCで6ミキシングC#とHTMLヘルパーは、ASP.NET MVC 6(ASP.NETコア)

<form asp-area="DAS" 
      asp-controller="Report" 
      asp-action="Add" 
      asp-route-id="@Model.id" 
      asp-route-incBalance="@Model.incBalance" 
      asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")" 
      asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")" 
      method="post" role="form"> 
    </form> 

を新しいヘルパータグを使用しています:

asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")" 

がいる場合にのみ適用されました:

0:結果

  { 
       if (Model.incBalance == 0) 
       { 
        asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")" 
       } 
      } 

、私はこのような何かを取得したいです

<form asp-area="DAS" 
      asp-controller="Report" 
      asp-action="Add" 
      asp-route-id="@Model.id" 
      asp-route-incBalance="@Model.incBalance" 
      asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")" 
      { 
      if (Model.incBalance == 0) 
      { 
       asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")" 
      } 
      } 
      method="post" role="form"> 
    </form> 

は、私はこれらのエラーを取得:よく形成しなければならない属性TagHelper

  if (Model.incBalance == 0) 

タグヘルパー '形式は' 要素の属性 宣言エリアでのC#を持っていなければなりません。

   asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")" 

私は、Visual Studioを使用している2015 Update 1の

アップデート1:私もこのオプションを試してみました

@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty) 

をしかし、エラーが残っ:

タグヘルパー 'フォーム'要素の属性 宣言領域にC#を使用してはいけません。かみそりで

 @(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty) 
+0

HTMLヘルパータグとは何ですか?私はここにいくつかのコードが欠けていると感じています...? – Liam

+0

@LiamこれはASP.NET Coreの機能です。 – poke

+0

私はここであなたの解決策は、 'asp-route-dateNext'を完全に除外しないで、むしろnull可能なDateTime /空文字列かコントローラで処理できるものを渡すことができると考えています。フォームタグでそのプロパティに条件付きを持たせるのではなく、コントローラで処理するのは実際には意味がありません。これには何らかの理由がありますか? –

答えて

3

は、マークアップのすべての部分がうまく形成しなければなりません。あなたはぶら下がった開始タグ、またはRazor表現のためのマークアップを持つことはできません。したがって、このようなものは有効とな原因構文エラーとしてではありません。

<!-- Interrupting a tag --> 
<div 
@if (condition) { 
    attribute="bar" 
} 
> 

<!-- Also not possible: Conditionally opening tags --> 
if (condition) { 
    <span> 
} 
Some text 
if (condition) { 
    </span> 
} 

だから、基本的にはレイザー式内のマークアップ、中括弧の間にすべてが、有効な式であることを確認する必要があり、かつタグがあること常に完了する。

これは残念ながら、@ifを条件付きで(タグヘルパー属性であるかどうかにかかわらず)追加することはできません。

単純なHTMLの場合は、Razorレンダリングrawテキストを使用できます。これはRazorパーサーによって解釈されないため、有効なマークアップである必要はありません。ただし、生のテキストでは、タグヘルパーも実行されないので、ここでは役に立ちません。

これは、現在3つの選択肢で、本質的にあなたを残します:

  1. ラップ巨人@ifのすべてと、本質的に全体formタグ複製:もちろん

    @if (condition) { 
        <form with-that-extra="attribute"> 
         All the form content 
        </form> 
    } 
    else { 
        <form> 
         All the form content 
        </form> 
    } 
    

    を、これはあなたのため、ちょうどひどいです実際にフォームコンテンツ全体を複製する必要があります(そうでなければ、@if内のタグはうまく構成されません)。

  2. @ifの状態チェックの背後にあるロジックをカプセル化する独自のタグヘルパーを作成しています。

    これは、より一般的なものにはうまくいきますが、オプションの属性を追加するだけで少し面倒です。条件が満たされない場合、ルートにいくつかの「NULL値」を渡す式の構文を使用して

  3. <form … 
        asp-route-dateNext="@(Model.incBalance == 0 ? Model.dataEnd.ToString("yyyy-MM-dd") : null)"> 
    </form> 
    

    これはおそらく最も簡単な解決策です。デフォルト値nullでは、タグヘルパーがその属性に対して実行されないようにするので、まったく省略した場合と同じです。

+1

詳細な回答ありがとうございます。私は3つの方法を利用しました。それは完全に私に合っている。あなたのコードにはカッコがありません: 'asp-route-dateNext =" @(Model.incBalance == 1?Model.dataEnd.ToString( "yyyy-MM-dd"):null) " –

+0

属性をnullに設定すると停止しますそれはHtmlでレンダリングされてから – JonTheMon

+0

@ JonTheMonその1つについては、よく分からなかった! (あなたは*その* JonTheMon、私が知っているものですか?^^) – poke

関連する問題