【问题标题】:ASP.NET StrongTyped Controller-Action View<TView,TModel>(TModel Data)ASP.NET StrongTyped Controller-Action View<TView,TModel>(TModel Data)
【发布时间】:2009-08-24 08:18:49
【问题描述】:

我正在使用 Asp.net MVC 1,我真的希望我的控制器操作使用 StronglyTyped View(data) 调用,这些调用在编译时强制执行类型检查,并且仍然让我在默认视图引擎下使用 aspx 页面。我调用的 ViewPages 是强类型的,但是在编译时无法捕获操作调用 View(data) 中的错误,因为内置的控制器 View(data) 方法不是强类型的,甚至不检查查看如果页面在编译时存在。

我已经使用 this post 实现了部分解决方案(下面的代码),但是(1)我无法让通用视图函数识别强视图页面的类型,除非我为强类型视图创建代码, 和 (2) Intellisense 和重构不适用于这种方法,这让我怀疑我正在使用的方法的可靠性。

问题: 从操作调用视图时,是否有更好的方法来强制执行类型?

替代方案:是否有替代方法,我的操作方法可以创建视图页的实例,直接设置一些属性,然后将其 HTML 呈现给操作响应?

代码: 这是我所有控制器继承的基类,以实现我目前所拥有的:

 public class StrongController : Controller 
    {

        protected ActionResult View<TView, TModel>(TModel model)
            where TView : ViewPage<TModel>
            where TModel : class
        {
            return View(typeof(TView).Name, model);
        }


    }

下面是一个正在使用的控制器示例: 命名空间 ExampleMVCApp.Controllers {

    public class HomeController : StrongController 
    {

        public ActionResult Index()
        {
            return View<ExampleMVCApp.Views.Home.Index, ExampleData>(new ExampleData());
        }


    }
}

类型识别所需的 ViewPage 代码后面... Aspx 标头不起作用

namespace ExampleMVCApp.Views.Home
{
    public class Issue : System.Web.Mvc.ViewPage<ExampleData>
    {
    }

}

【问题讨论】:

  • 我不明白你为什么要这样做。您似乎正在解决一个不存在的问题。
  • 视图需要特定类型的数据,我希望框架能够强制执行。
  • 也许我有点太担心了。但是我经常让其他人在 ViewPages 上工作,这将使与他们的 Views 交互更容易。

标签: asp.net-mvc controller action typing strongly-typed-view


【解决方案1】:

我认为你应该给T4MVC helpers 一个旋转(原始公告之一here)。这至少可以让您摆脱已有的代码,因为这些模板会根据您已有的视图生成代码,并且您使用这些“假”方法调用来处理您的视图。

为了让您对 View 的调用被强类型化为您的视图声明的特定模型,我不确定这些助手是否可以帮助您(尽管我怀疑他们会这样做)。但是,如果他们不这样做,您仍然可以自行破解 T4MVC 代码,或联系原作者David Ebbo,以建议添加该功能。

【讨论】:

  • 感谢您的建议。我将检查这些并报告它们是否适合我的情况。
  • 我花了几个小时玩 T4 和 MVC 期货 html 助手。 T4 很好,通常运行良好。然而,当我用奇怪的编译错误重构我的代码时,它让我多次抱怨的自动生成代码,并且从关于它的构造的博客来看,整个工具似乎很难维护。我将继续使用我上面的方法和可能的一些 lambda 函数的组合,直到 MVC 核心提供更好的内置方法。结论:我认为您的 T4 建议是一个非常有效的选择,我只会在保持简单和稳定方面犯错。谢谢。
  • 感谢您的反馈。我自己没有使用过 T4MVC 助手,你让我好奇它的 View 助手是否是强类型的,开箱即用。您能对此提供一些反馈吗?
  • Inside a View 我认为答案大部分是肯定的,我使用它来强烈键入我的调用以从控制器呈现视图并没有太大的成功。我没有给它我可以拥有的最完整的测试集,因为当我改变我的数据类和视图来测试它时,我导致了许多必须手动清理的编译错误,这足以阻止我使用它。此外,我找不到其他人使用它作为我想要的无缝解决方案的任何明确示例,我希望微软明年可以用更好的系统更新 VisualStudio。
  • 我主要希望默认的 aspx 驱动的视图引擎得到彻底检查,以便所有视图都完全编译并检查类型。如果他们这样做了,那么对魔术字符串、匿名对象和代码自动生成工具的需求就会消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多