代码之家  ›  专栏  ›  技术社区  ›  MichaelGG

为模型类型强键入ASP.NET Controller.View()方法

  •  2
  • MichaelGG  · 技术社区  · 17 年前

    没有强类型View()方法返回ActionResult。那么,假设我有

    class Edit : ViewPage<Frob>
    

    在我的FrobController中,我将执行类似“返回视图(“编辑”,someFrob);”的操作。这里没有进行检查,所以我必须始终手动同步视图和控制器对它的使用。这是次优的,我不知道有任何内置的修复程序。

    public ActionResult ViewPage<V, M>(V view, M model)
        where V : ViewPage<M>
        where M : class {
        return View(typeof(V).Name, model);
    }
    

    注:我发表观点的原因 否则,推理将起作用。如果我 删除了视图参数,我需要 意味着也要显式地指定M。。。 叹气

    现在,我可以做到:

      return ViewPage(new Views.Frob.Edit(), myFrob);
    

      return ViewPage((Views.Frob.Edit)null, myFrob);
    

    一个缺点是,该模型必须完全匹配。因此,使用ViewPage>,我不能传名单。我想这可能有用:

        public ActionResult ViewPage<V, M, T>(V view, T model)
            where V : ViewPage<M>
            where M : class 
            where T : M {
            return View(typeof(V).Name, model);
        }
    

    但是C#的类型推断无法理解它。另一个潜在的问题是视图类型的名称可能不是正确的名称,因为我认为它可以被属性覆盖。但如果我碰到它,这是一个很容易解决的问题。

    1. 如何使此语法更清晰?
    2. 我在这里遗漏了什么缺点?

    3 回复  |  直到 17 年前
        1
  •  3
  •   Craig Stuntz    17 年前

    我看到的第一个问题是,您现在已使控制器意识到视图。这是一条你永远不应该越过的线。

        2
  •  3
  •   Roberto Barros    17 年前

    看看这个例子: http://oddiandeveloper.blogspot.com/2008/11/strongly-typed-view-names.html

    return View(typeof(Views.en.Home.about), AboutModel);
    
        3
  •  0
  •   Mike Glenn    17 年前

    public ActionResult Test() {
        return View<Views.Module1.Test, string>("Hello All");
    }
    
    
    protected ActionResult View<TView, TModel>(TModel model)
        where TView : ViewPage<TModel>
        where TModel : class {
            return View(typeof(TView).Name, model);
    }
    

    您牺牲了类型推断,但得到了完整的编译时类型检查,并且不必重新创建未使用的对象。