0

一部のコントローラーを手動でインスタンス化する必要があるため、次のコードがあります。

var controller = Activator.CreateInstance(typeof(AccountController), 
                 repository) as AccountController;

AccountController には、次のようなメソッドがあります。

[AllowAnonymous]
[HttpPost]
public ApiJsonResult LogOn(LogOnAccountDto model)
{
     ValidateModel(model);
     if (ModelState.IsValid)
     {
      //...
     }
}

ModelState.IsValid を機能させたいので、ValidateModel を呼び出してモデルに渡します。

どうやらcontrolContextが設定されていないため、これは失敗します。次のエラーが表示されます。

値を null にすることはできません。パラメーター名: controllerContext 説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentNullException: 値を null にすることはできません。パラメータ名: controllerContext

では、「すべて」が機能するように、コードで IController を手動でインスタンス化するにはどうすればよいでしょうか。

前もって感謝します。

では、なぜこれが必要なのですか? 「オンライン戦略ゲーム」のアーキテクチャとゲーム ロジックのアイデアをいじっています。

ゲームの Web バージョンである ASP.NET MVC 4 (プレビュー) アプリケーションがあります。このゲームは、NATIVE アプリを介して Windows Phone や iPhone などのデバイスでもプレイする必要があるという考えです。したがって、ゲーム用の API (http/json を介して通信するある種の REST サービス) が必要です。この API はゲームのパブリック インターフェースになるため、もちろんすべてのゲーム ロジックはこの API の側に配置されます。

そのため、この API を「Web 版」と「モバイル版」の両方のゲームから使用したいと考えています。この API を ASP.NET MVC 4 (プレビュー) 内のエリアとして実装しました。私の最初のことは、実際に「Web バージョン」から API に httpwebrequest を実行することだったので、「モバイル バージョン」とまったく同じように API を使用していました。しかし、APIを「正しい方法」で呼び出すことで得られるjson / web呼び出しのオーバーヘッドをすべて回避するために、実際にはコントローラーを手動でインスタンス化する方がよいのではないかと考えました。

それが私が今ここにいる理由です。コードでコントローラーを手動でインスタンス化したいのです。コントローラーで正確なロジックを使用したいからです。

理にかなっていますか?より良いアイデアがあれば教えてください - 私は実際の製品を生産するのではなく、それを学ぶためにこれを行っています - 少なくともそれは今の目標ではありません - 今私はいくつかの新しいことを学ぼうとしています. :)

4

1 に答える 1

0

ValidateModel直接電話する必要はありません。

少なくとも、自分のコードで直接呼び出す必要はなく、呼び出す例も見たことがありません。

の属性を使用してSystem.ComponentModel.DataAnnotations、モデルの検証方法を制御できます。

いくつかの動作中のコードからコピーして貼り付けた例を挙げましょう。

モデルクラス:(
基本的にはDTOであり、特別なことは何もありません。)

public class ArticleModel
{
    public ArticleModel()
    {
        CategoryIds = new List<int>();
    }

    public int Id { get; set; }

    [Required(ErrorMessage = "Field mandatory!")]
    public string Title { get; set; }

    [Required(ErrorMessage = "Field mandatory!")]
    public string Text { get; set; }

    public string Summary { get; set; }

    public bool RefreshDate { get; set; }

    public List<int> CategoryIds { get; set; }
}

コントローラのアクション:
(ORMのオブジェクトをインスタンス化し、データベースに保存します。)

[HttpPost]
[ValidateInput(false)]
[SiteAuthorize(SiteAuthorization.SiteOwner)]
public ActionResult EditArticle(ArticleModel model)
{
    var article = Repository.Retrieve<Article>().SingleOrDefault(x => x.Id == model.Id && x.Site == ColorfulUtility.CurrentSite);

    if (article == null)
        return RedirectToAction("ArticleList");

    if (ModelState.IsValid)
    {
        if (model.RefreshDate)
            article.Date = DateTime.Now;

        article.Title = model.Title.SimpleTextToSafeHtml();
        article.Text = model.Text.RichTextToSafeHtml();
        article.Summary = model.Summary.RichTextToSafeHtml();

        foreach (var category in ColorfulUtility.CurrentSite.ArticleCategories)
        {
            if (!article.Categories.Contains(category) && model.CategoryIds.Contains(category.Id))
            {
                article.Categories.Add(category);
            }
            else if (article.Categories.Contains(category) && !model.CategoryIds.Contains(category.Id))
            {
                article.Categories.Remove(category);
            }
        }

        Repository.Flush();

        return RedirectToAction("ArticleList");
    }

    return View("CreateArticle", model);
}
于 2012-01-12T12:05:54.877 に答える