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

时间:2009-01-23 19:03:47

标签: c# asp.net-mvc

没有强类型的View()方法来返回ActionResult。所以,假设我有

class Edit : ViewPage<Frob>

在我的FrobController中,我将执行类似“return View(”Edit“,someFrob);”的操作。这里没有检查,所以我必须总是手动同步视图和控制器对它的使用。这不是最理想的,我不知道任何内置的修复。

我将此方法添加到我的控制器基类:

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

注意:我接受观点的原因   从未使用的对象是因为,   AFAIK,没有办法获得C#的类型   推断工作否则。如果我   删除了view参数,我需要   明确指定V,也是   意味着明确指定M ......   叹息。

现在,我可以这样做:

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

我正在指定确切的视图(如果重命名则没有问题),并且myFrob被选中为正确的模型类型。丑陋的一面是我新编了一个编辑。或者,我可以写:

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

一个缺点是模型必须完全匹配。因此,使用ViewPage&gt;,我无法传入List。我认为这可能有用:

    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. 编辑:关于控制器了解视图,它只是稍微有点。它从视图中获得的唯一内容是Type,它为此获取名称。所以这相当于传入字符串名称。强类型模型必须匹配或失败。所以它并不太了解View - 它只是让编译器捕获错误的一个技巧。

3 个答案:

答案 0 :(得分:4)

我看到的第一个问题是你现在让你的控制器知道视图。这是你永远不应该跨越的一条线。

答案 1 :(得分:3)

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

您可以像这样调用您的视图:

return View(typeof(Views.en.Home.about), AboutModel);

答案 2 :(得分:0)

通过这样做,我仍然在摸索你所获得的东西,而不是说你错了。 Ayende几乎每天都对我做同样的事情:-)无论如何,我能想出的最干净的语法是:

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);
}

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