2

私は MVC が初めてで、問題に遭遇しました。

Stephen Walters のブログ (ここを参照) を読んでいる、MVC アクション パラメータが HttpRequest オブジェクト (クエリ文字列、フォーム、Cookie、およびサーバー変数) 内のデータと照合しようとしていることがわかります。彼の例は、2 つの値を取得する標準アクションを示しています。

public ActionResult Index(string HTTP_USER_AGENT, string myCookie)
{
    ViewData["HTTP_USER_AGENT"] = HTTP_USER_AGENT;
    ViewData["myCookie"] = myCookie;
    return View();
}

これにより、HTTP_USER_AGENT と Cookie (myCookie) の値 (存在する場合) が取得されます。

ただし、この例を実行しようとすると、両方の params = null !

試してみると、Cookieが存在します(以前に作成しました):

string c = Request.Cookies["myCookie"].Value;

それは私が期待している値を持っています! さらに不可解なのは、HTTP_USER_AGENT が null であることです。

何か案は???

ありがとう!!!

4

3 に答える 3

1

MVC 3 以降には、4 つのコレクションのデフォルト値プロバイダーが含まれています。

FormRouteDataQueryStringおよびFile

Cookie およびサーバー変数の値プロバイダーはありません。しかし、これらのコレクションに対して独自の値プロバイダーを作成できるようです。

クッキーの例:

public class CookieValueProviderFactory : ValueProviderFactory
{
    public class CookieValueProvider : IValueProvider
    {
        private readonly HttpCookieCollection _cookies;

        public CookieValueProvider(HttpCookieCollection cookies)
        {
            _cookies = cookies;
        }

        public bool ContainsPrefix(string prefix)
        {
            return _cookies.AllKeys.Any(x => x.Contains(prefix));
        }

        public ValueProviderResult GetValue(string key)
        {
            if (_cookies == null)
            {
                return null;
            }

            var val = _cookies[key] == null ? null : _cookies[key].ToString();
            var val = _cookies[key];
            return val != null
                       ? new ValueProviderResult(val, val.ToString(), CultureInfo.CurrentCulture)
                       : null;
        }
    }

    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        return new CookieValueProvider(controllerContext.HttpContext.Request.Cookies);
    }
}

それを global.asax に登録します。

protected void Application_Start()
{
        ...

    ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
    RegisterRoutes(...)
}
于 2013-05-24T15:03:44.937 に答える
0

ソース コードをチェックインするValueProviderFactories.csと、次の値プロバイダーが一覧表示されます。

public static class ValueProviderFactories
{
    private static readonly ValueProviderFactoryCollection _factories = new ValueProviderFactoryCollection()
    {
        new ChildActionValueProviderFactory(),
        new FormValueProviderFactory(),
        new JsonValueProviderFactory(),
        new RouteDataValueProviderFactory(),
        new QueryStringValueProviderFactory(),
        new HttpFileCollectionValueProviderFactory(),
    };

    public static ValueProviderFactoryCollection Factories
    {
        get { return _factories; }
    }
}

Cookie 値プロバイダーまたはサーバー変数プロバイダーがないようです。

于 2013-05-24T15:04:25.220 に答える
0

そのブログ記事は、MVC1/MVC2 時代の 2008 年のものです。これを行うことのセキュリティへの悪影響に関する記事の下部にあるコメントのいくつかに基づいて、MVC3 および MVC4 でこの機能が削除されたと思います。

于 2013-05-24T14:53:23.957 に答える