2

いくつかのデータがありますが、そのデータが空白の場合があります。ビューに大量のクレイジーなロジックを作成する代わりに、データが存在する場合はそれをレンダリングするヘルパー メソッドを使用し、文字列が空/null の場合は「N/A」とだけ表示される HTML をレンダリングします。

理想的な構文:@Helpers.RenderThisOrThat(Model.CustomerPhone)

(文字列) が空の場合、Model.CustomerPhone代わりにこの代替 HTML がレンダリングされます。<span class='muted'>N/A</span>

これまでの内容は次のとおりです。

@helper RenderThisOrThat(string stringToRender, string methodToGetAlternateText = null)
{
    @RenderThisOrThat(MvcHtmlString.Create(stringToRender), methodToGetAlternateText)
}

@helper RenderThisOrThat(MvcHtmlString stringToRender, string methodToGetAlternateText = null)
{
    if (string.IsNullOrWhiteSpace(stringToRender.ToHtmlString()))
    {
        if (!string.IsNullOrWhiteSpace(methodToGetAlternateText)) {
            @methodToGetAlternateText
        }

        <span class='muted'>N/A</span>
    }

    @stringToRender
}

これは、いずれかのパラメーターに文字列以外のものを渡す必要があるまでは問題なく機能します。たとえば、電子メール アドレスがある場合、電子メールの文字列だけでなく、その電子メールへのリンクである必要があります。

@Helpers.RenderThisOrThat(@<a href="mailto:@Html.DisplayFor(m => m.CustomerEmail)">@Html.DisplayFor(m => m.CustomerEmail)</a>)

「デリゲート型ではないため、ラムダ式を '文字列' 型に変換できません」というエラーが表示されます。

これを機能させる方法について途方に暮れています...ここで何か助けはありますか?

4

2 に答える 2

2

これは、単純な問題に対する非常に複雑な解決策です。複雑なビューを作成する必要はありません。実際、Editor / DisplayTemplateを使用する必要があります。次に、ロジックをテンプレートに配置すると、ヘルパー関数などを追加する必要なしに、一度実行されます。

この場合はメールアドレスをレンダリングしているので、ここでさらに一歩進むこともできます。モデルにDataType属性を適用してから、電話番号のレンダリングタイプを指定します。

public class MyModel {
    [DataType(DataType.PhoneNumber)]
    public string PhoneNumber {get;set;}
}

次に、〜/ Views / SharedにDisplayTemplatesというフォルダーを作成し、そのフォルダーにPhoneNumber.cshtmlというファイルを作成します。このファイルで次のようにします。

@model string

@if (string.IsEmptyOrWhiteSpace(Model)) {
    @:<span class='muted'>N/A</span>
} else {
   @: <span>@Model</span>
}

次に、あなたの見解では:

@Html.DisplayFor(x => x.PhoneNumber)

それだけです。あなたの見解では複雑なロジックはなく、どこにでも複雑なヘルパー関数はありません。これはシンプルで、簡単で、メンテナンスが容易です。EmailAddressデータ型もあるので、Emailアドレスに対しても同じことができます。

MVCには非常に優れた機能が多数組み込まれていますが、実際に学習するのに時間を費やしていないため、ほとんどの人は使用しません。

于 2013-03-01T20:57:28.320 に答える
2

文字列を受け取り、次のようなヘルパーを探しています。

  1. 文字列が空でない場合は、その文字列をレンダリングします。
  2. 文字列が空でない場合は、指定されたテンプレートをレンダリングします。
  3. 文字列が空の場合、"N/A" html をレンダリングします。
  4. 文字列が空の場合、指定されたテンプレートをレンダリングします。

Razor ブロックをパラメーターとして関数に渡すと、razor はブロックを Func としてパッケージ化します。ヘルパー関数のパラメーターを変更して、そのタイプのデリゲートを受け取り、それらのデリゲートを呼び出すことを忘れないでください (私は null を渡すことにしました)。

これらのヘルパーは、これらのシナリオを処理する必要があります。

解決

@helper RenderThisOrThat(string stringToRender, Func<object, IHtmlString> leftTemplate = null, Func<object, IHtmlString> rightTemplate = null)
{
    var shouldRenderLeft = !string.IsNullOrWhiteSpace(stringToRender);
    leftTemplate = leftTemplate ?? (o => MvcHtmlString.Create(stringToRender));
    @RenderThisOrThat(shouldRenderLeft, leftTemplate, rightTemplate)
}

@helper RenderThisOrThat(bool shouldRenderLeft, Func<object, IHtmlString> leftTemplate, Func<object, IHtmlString> rightTemplate = null)
{
    var shouldRenderRight = !shouldRenderLeft;
    if (shouldRenderRight)
    {
        if (rightTemplate != null)
        {
            @rightTemplate(null)
        }
        else
        {
            <span class='muted'>N/A</span>
        }
    }
    else
    {
        @leftTemplate(null)
    }
}

1. @Helpers.RenderThisOrThat(Model.StringWithBob)
2. @Helpers.RenderThisOrThat(Model.StringWithNull)
3. @Helpers.RenderThisOrThat(Model.StringWithBob, @<span>I'm @Model.StringWithBob</span>)
4. @Helpers.RenderThisOrThat(Model.StringWithNull, @<span>I'm @Model.StringWithBob</span>)
5. @Helpers.RenderThisOrThat(Model.StringWithBob, @<span>I'm @Model.StringWithBob</span>, @<span>What about Bob?</span>)
6. @Helpers.RenderThisOrThat(Model.StringWithNull, @<span>I'm @Model.StringWithBob</span>, @<span>What about Bob?</span>)

出力します:

  1. Bob
  2. <span class='muted'>N/A</span>
  3. <span>I'm Bob</span>
  4. <span class='muted'>N/A</span>
  5. <span>I'm Bob</span>
  6. <span>What about Bob?</span>
于 2013-03-01T20:02:03.223 に答える