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。我收到此错误:

值不能为空。参数名称:controllerContext 描述:当前Web请求执行过程中发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentNullException:值不能为空。参数名称:controllerContext

那么,如何在代码中手动实例化 IController - 以便“一切”正常工作?

提前致谢。

那么,我为什么需要这个? 我正在玩一些“在线战略游戏”的架构和游戏逻辑想法。

我有一个 ASP.NET MVC 4 (Preview) 应用程序,这是我的网络版游戏。这个想法是,游戏也应该通过 NATIVE 应用程序在 Windows Phone、iPhone 等设备上玩。因此,我的游戏需要一些 API(某种通过 http/json 通信的 REST 服务)。由于此 API 将是游戏的公共接口,因此所有游戏​​逻辑当然都位于此 API 中。

因此,我想在游戏的“网页版”和“移动版”中都使用这个 API。我已将此 A​​PI 实现为 ASP.NET MVC 4(预览版)中的一个区域。我的第一个想法实际上是从我的“网络版本”到 API 执行 httpwebrequest,所以我完全按照“移动版本”的方式使用 API。但后来我想,实际上手动实例化控制器可能会更好,以避免我从“正确的方式”调用 API 中获得的所有 json/web 调用开销。

所以这就是我现在在这里的原因,我想在代码中手动实例化我的控制器,因为我想在它们中使用确切的逻辑。

说得通?如果你有更好的想法,请告诉我——我这样做是为了学习它,而不是生产真正的产品——至少这不是现在的目标——现在我只是想学习一些新东西:)

4

1 回答 1

0

你不需要ValidateModel直接打电话。

至少我从来不需要在我的任何代码中直接调用它,而且我也没有看到任何可以调用它的示例。

您可以使用 from 的属性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 回答