【问题标题】:Using a generic model in ASP.NET MVC Razor在 ASP.NET MVC Razor 中使用泛型模型
【发布时间】:2011-08-09 19:18:33
【问题描述】:

是否可以在 ASP.NET MVC 3 (w/ Razor) 中使用通用模型?以下失败并出现语法错误:

@model DtoViewModel<T> where T : IDto

【问题讨论】:

    标签: generics asp.net-mvc-3 razor


    【解决方案1】:

    鉴于@model 期待一个类型 - 而不是类型声明 你可以使用:

    @model DtoViewModel<IDto>
    

    并利用泛型协方差

    【讨论】:

      【解决方案2】:

      Razor 不支持这种语法,抱歉。

      【讨论】:

      • 无赖。我很想在未来看到对它的支持,但我还没有看到其他人抱怨它,所以我怀疑它会获得任何形式的牵引力。谢谢你的回答。
      • 我要这个!所以这是抱怨,或者至少是另一个人的要求。
      【解决方案3】:

      假设您想使用泛型类型以避免ViewModel&lt;T&gt; 的每个视图中的代码重复,您可以这样做:

      1.为视图特有的ViewModel&lt;T&gt;部分创建视图

      ModelView.cshtml

      @model ViewModel<specificType>
      
      @{Layout = "~/Views/Shared/Layout.cshtml";}
      <h2 class="sub-header">Specific type view</h2>
      

      2.为公共部分创建一个视图,该视图应在&lt;T&gt;的每个视图中呈现

      Grid.cshtml

      @{ var webGrid = new WebGrid(Model.PageItems); }
      
      <div class="row" style="overflow: auto">
          @webGrid.GetHtml("table-striped", mode: WebGridPagerModes.All, firstText: "First", lastText: "Last")
      </div>
      

      由于是局部视图,所以不需要再次声明Model的类型。它只会使用您在父视图中定义的模型来呈现它。您的模型的属性IList&lt;T&gt; PageItems 将保持为&lt;specificType&gt; 的强类型。

      3。不要忘记实际渲染公共部分的局部视图

      ModelView.cshtml

      @RenderPage("~/Views/Shared/Grid.cshtml")
      

      【讨论】:

        【解决方案4】:

        这并不理想,但它很有效,并且可以通过这种模式变得非常有创意。

        @model YourNameSpace.MyModel
        
        
        public MyModel
        {
            public MyGenericType<string> ModelAStuff {get;set;}
            public MyGenericType<int> ModelBStuff {get;set;}
            public MyGenericType<DateTime> ModelCStuff {get;set;}
        }
        
        public class MyGenericType<T>
        {
          //use T how ever you like
          public T Color {get;set;}
          public T Year  {get;set;}
        }
        

        【讨论】:

        • 我一直这样工作。这不是很好,但似乎是目前最好的解决方案。
        【解决方案5】:

        我找到了这个线程并做了一些进一步的挖掘。 该功能似乎在 2.2.0 待办列表中。如果有人想参与,您可以在 Github 上查看问题。 https://github.com/aspnet/Mvc/issues/7152

        【讨论】:

          猜你喜欢
          • 2015-07-07
          • 2022-01-07
          • 2010-12-02
          • 1970-01-01
          • 1970-01-01
          • 2019-02-26
          • 1970-01-01
          • 2011-05-08
          • 1970-01-01
          相关资源
          最近更新 更多