1

一意の「文字列」に定義の問題が含まれていません。

次のビュー コードを使用します。

@if (ViewBag.Stories != null)
{
    if (ViewBag.Stories.Count > 0)
    {
    <h2>Stories (@ViewBag.Stories.Count)</h2>
    <ul>
        @foreach (var item in ViewBag.Stories)
        {
            <li>
                @("test".ToString().ToSeoUrl())
                <h2>@(item.Title.ToString().ToSeoUrl())</h2>
            </li>
        }
    </ul>
    }
}

「.ToString().ToSeoUrl()」を item.Title から削除すると、次のようになります。

  • テスト

    題名

  • テスト

    題名

  • テスト

    題名

追加したら。例外が発生します

「/」アプリケーションでサーバー エラーが発生しました。

「文字列」には「ToSeoUrl」の定義が含まれていません

私は Razor を使用しており、ビューに次のヘルパー クラスを登録しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.Mvc;

namespace MyNamespace.Helpers
{    
    public static class StringExtensions
    {
        public static string ToSeoUrl(this string url)
        {
        // make the url lowercase
        string encodedUrl = (url ?? "").ToLower();

        // replace & with and
        encodedUrl = Regex.Replace(encodedUrl, @"\&+", "and");

        // remove characters
        encodedUrl = encodedUrl.Replace("'", "");

        // remove invalid characters
        encodedUrl = Regex.Replace(encodedUrl, @"[^a-z0-9]", "-");

        // remove duplicates
        encodedUrl = Regex.Replace(encodedUrl, @"-+", "-");

        // trim leading & trailing characters
        encodedUrl = encodedUrl.Trim('-');

        return encodedUrl;
        }
    }
}

item は、パブリック文字列 Title を持つ Story というカスタム クラスです。

4

1 に答える 1

5

拡張メソッドは動的にディスパッチできません。ViewBagwhich isdynamicおよびToSeoUrlwhich is 拡張メソッドを使用しているため、 RuntimeBinderException.

これを解決するには、次の 2 つの方法があります。

  1. キャストを使用します。動的にディスパッチされるため、<h2>@(((string)item.Title).ToSeoUrl())</h2>呼び出すToString()だけでは不十分です。
  2. 通常の静的メソッドとして、拡張メソッド構文なしで拡張メソッドを呼び出します。<h2>@(StringExtensions.ToSeoUrl(item.Title))</h2>
于 2012-07-26T20:32:42.017 に答える