【问题标题】:Strongly typed views in NHaml?NHaml 中的强类型视图?
【发布时间】:2026-01-31 22:40:01
【问题描述】:

我有一个强类型视图,想在 NHaml 页面中使用它。

对于 WebForms 引擎,我将在 <%@ Page%> 指令或代码隐藏文件中描述 ViewData 类型。

我将如何在 NHaml 中解决这个问题?

【问题讨论】:

    标签: c# asp.net-mvc strongly-typed-view nhaml


    【解决方案1】:

    鲍里斯

    如果我理解正确,您只是想要一个强类型的 NHML 视图?

    如果是这种情况,svn 中有一个示例项目可以执行此操作。来看看

    http://nhaml.googlecode.com/svn/trunk/src 和 NHaml.Samples.Mvc.CSharp 项目

    这是一些提取的代码

    控制器

    public class ProductsController : Controller
    {
        private readonly NorthwindDataContext northwind = new NorthwindDataContext(
            ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString );
    
    
        public ActionResult Edit( int id )
        {
            var viewData = new ProductsEditViewData { Product = northwind.GetProductById( id ) };
    
            viewData.Categories = new SelectList( northwind.GetCategories(), "CategoryID", "CategoryName", viewData.Product.CategoryID );
            viewData.Suppliers = new SelectList( northwind.GetSuppliers(), "SupplierID", "CompanyName", viewData.Product.SupplierID );
    
            return View( "Edit", viewData );
        }
    
    }
    

    查看

    %h2= ViewData.Model.Product.ProductName
    %form{action='#{Url.Action("Update", new { ID=ViewData.Model.Product.ProductID \})}' method="post"}
      %table
        %tr
          %td Name:
          %td= Html.TextBox("ProductName", ViewData.Model.Product.ProductName)
        %tr
          %td Category:
          %td= Html.DropDownList("CategoryID", ViewData.Model.Categories, (string)null)
        %tr
          %td Supplier:
          %td= Html.DropDownList("SupplierID", ViewData.Model.Suppliers, (string)null)
        %tr
          %td Unit Price:
          %td= Html.TextBox("UnitPrice", ViewData.Model.Product.UnitPrice.ToString())
      %p
      - Html.RenderPartial(@"_Button")
    

    查看模型

    public class ProductsEditViewData
    {
        public Product Product { get; set; }
        public SelectList Suppliers { get; set; }
        public SelectList Categories { get; set; }
    }
    

    希望有帮助

    【讨论】:

    • 嗯,差不多。我实际上希望它可以与新的 asp.net mvc 2 LabelFor() 和其他 XFor Html 助手一起使用。据我所知,根据您和其他人的回答,我不需要在任何地方放置指令。我什至没有尝试它是否会起作用,所以我稍后会试一试。
    【解决方案2】:

    this 页面上有一个补丁(搜索 NHaml)可以做到这一点。我不知道它是否有效。这需要来自 MvcContrib 的 NHaml。

    用于升级 NHaml View Engine 的补丁 它可以与 MVC Preview 3 一起使用 NHamlView 上的模型属性 允许强类型访问 ViewDataDictionary 中的模型数据 因为接口属性是非 通用的,我们喜欢强类型 我们在 Views 中的 ViewData 访问.. 例如预览 2 下的 ViewData.Property 将成为 Model.Property 下 预览 3 已应用 2008 年 5 月 30 日:已应用 在修订版 375 中。

    【讨论】:

    • 预览 3?那是很久以前的事了!为什么到现在还没有收录?无论如何我会看看它,谢谢
    【解决方案3】:

    我将描述 ViewData 类型 指令或在 代码隐藏文件。

    我将如何在 NHaml 中解决这个问题?

    不需要这样做。您可以只使用模型而不指定其类型,它会起作用。例如:

    %h2= Model.PageTitle
      %p= Model.UserMessageOrSomething
    

    这是因为 NHAML 视图已编译。因此,当模型上的所有属性(名称、类型等)都正确时,视图将被编译(就像源代码一样)。

    【讨论】:

    • 真的吗?凉爽的。我认为这确实为将来制作自动完成功能造成了障碍:S
    • 其实lanwin已经有自动补全的解决方案了:)