8

ASP.NET MVC 6 で新しいヘルパー タグを使用しています。

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

次の場合にのみ適用されました。

          {
              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)

タグ ヘルパー 'form' では、要素の属性宣言領域に 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)

しかし、エラーは残りました:

タグ ヘルパー 'form' では、要素の属性宣言領域に C# を含めることはできません。

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

2 に答える 2

10

Razor では、マークアップのすべての部分が適切に形成されている必要があります。開始タグをぶら下げたり、Razor 式のマークアップを中断したりすることはできません。したがって、このようなものは無効であり、構文エラーが発生します。

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

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

そのため、Razor 式内のマークアップ (基本的に中括弧内のすべて) が有効な式であり、タグが常に完全であることを確認する必要があります。

@ifこれは残念ながら、(タグ ヘルパー属性であるかどうかに関係なく) 属性を条件付きで追加するために を使用できないことを意味します。

単なる HTML の場合は、Razor パーサーによって解釈されず、有効なマークアップである必要がないため、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条件チェックの背後にあるロジックをカプセル化する独自のタグ ヘルパーを作成します。

    これはより一般的なものにはうまく機能しますが、オプションの属性を追加するだけでは少し面倒です。

  3. 式構文を使用して、条件が満たされない場合に「null 値」をルートに渡します。

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

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

于 2016-03-30T08:54:00.067 に答える