2017-10-27 15 views
-4

MVCカミソリを初めて使ったので、私がしたいことを達成するための効率的な方法を見つけることができませんでした: 私の目的は、タイトルとそのリンクの他のタイトルは、リンクがある場合にのみリンクとして表示する必要があります。私はタイトルがそれに対応するリンクフィールドにもかかわらず、リンクとして表示され得る上記のコードではMVCカミソリのタイトルとして条件付きでタイトルを表示する

@model PaginatedList<MyProject.Models.Todo> 

    @foreach (var item in Model) { 
      <tr> 
       <td> 
        @{ 
         int? length = @Html.DisplayFor(modelItem => item.Link).ToString()?.Length; 
        } 

        @if (length is null) 
        { 
        @Html.DisplayFor(modelItem => item.Title) 
        } 
        else 
        { 
        <a href="@Html.DisplayFor(modelItem => item.Link)" target=_blank> 
         @Html.DisplayFor(modelItem => item.Title) 
        </a> 
        } 
       </td> 
       <td> 
        <a [email protected](modelItem => item.Link) target="_blank">@Html.DisplayFor(modelItem => item.Link)</a> 
       </td> 
      </tr> 

空です:

は、私はこれを試してみました。それを修正するには?

+0

@lengthは常に同じ値になり、nullではありません。 –

+1

'intを置き換えると**正確に**何が起こりますか? length = @ Html.DisplayFor(modelItem => item.Link).ToString()?Length; 'with'int? length = item?.Link?.Length; '? – mjwills

+0

これで、@lengthの値が変更され、必要なタイトルにリンク形式が適用されません。 –

答えて

2

あなたは複雑になっています。

nullか単に空の文字列かどうかを確認して、タイトルだけを使用して、他の方法でテキストとハイパーリンクを作成することができます。

そして、あなたはアンカーリンクのためにやっているように、あなただけのhrefの値とアンカー要素の内部テキストをレンダリングするためにModelプロパティを使用し、別のHTML内のHTMLを生成するためのヘルパーメソッドを使用する必要はありません。

@if (String.IsNullOrEmpty(item.Link)) 
{ 
    @Html.DisplayFor(modelItem => item.Title) 
} 
else 
{ 
    <a href ="@item.Link" target=_blank>@item.Title</a> 
} 

希望します!

+0

PaginatedList 'に' Link 'の定義が含まれておらず、' PaginatedList 'タイプの最初の引数を受け付ける拡張メソッド' Link 'がありませんでした(使用するディレクティブまたはアセンブリ参照がありませんか? –

+0

) '@ Model'の代わりに' @ item'を使用していますが、実際には間違っていると誤解されています。 –

+0

エラーが発生しました。ここでItem.Titleは利用できません。 –

1

変更:

int? length = @Html.DisplayFor(modelItem => item.Link).ToString()?.Length; 

には: - ではない生成されたHTML

int? length = item?.Link?.Length; 

これは、あなたLinkの長さを取得します。

関連する問題