代码之家  ›  专栏  ›  技术社区  ›  Andrew Burns

ASP.NET MVC+JQ网格嵌入链接最佳实践

  •  0
  • Andrew Burns  · 技术社区  · 15 年前

    我有一个MVC应用程序,我正在用jqgrid[xml]替换一些硬呈现的表。

    问题是我的某一列中有操作链接,可以对行执行某些操作。我在XML中使用了CData标记,但问题是现在这个标记是在action方法中生成的,所以所有的HTML都在我的控制器中(在TagBuilder中),这显然不好。

    我本来打算研究renderpartialistensions,但你需要一个htmlhelper实例,另外我使用的是brail视图引擎,所以我甚至不确定这是否可行。

    其他人是怎么处理的?
    我想我可以创建一个像HTML一样呈现实际XML的视图,但是我需要为每个XML数据源创建一个视图,并且我已经拥有了这些视图。

    提前感谢您的意见。

    2 回复  |  直到 15 年前
        1
  •  0
  •   tvanfosson    15 年前

    我不确定您要问的是什么,但我有一些XML数据——弃权、发布等的法律数据——在我的视图中呈现。我走了htmlhelper扩展路径,创建了一个扩展,它获取文档的URL和将其转换为HTML的XSLT样式表。我使用LinqXML类在memoryStream中加载XML并将其呈现为HTML。然后,它以字符串的形式返回,该字符串通过视图写入响应。如果您没有访问HTML助手的权限,您可以在静态类上编写类似于静态方法的内容(这就是扩展的内容),但不能使用扩展语法。这可以在您喜欢的任何视图中呈现。

    我的代码示例:

     <%= Html.RenderXML( Url.Content( "~/App_Data/waiver.xml" ),
                         Url.Content( "~/Content/styles/waiver.xsl" ) ) %>
    
        2
  •  0
  •   Andrew Burns    15 年前

    为了澄清更多的体系结构以及我是如何解决它的。我有以下项目/程序集:

    1. 业务对象
    2. VB XML反/序列化库
    3. ASP.NET MVC项目

    VB XML程序集只处理业务(1)模型的业务对象的序列化。所以我会输出这样的Xelement:

    <invoice>
       <invoiceId>1234</invoiceId>
       <customer>Hudsucker Industries</customer>
       <otherBusinessData>etc, etc</otherBusinessData>
    </invoice>
    

    问题是我正在使用jqgrid,我需要将元素添加到每个发票的某些操作中,因此我需要类似以下内容:

    <invoice>
       <actionHtml><![CDATA[   ...some HTML such as links... ]]></actionHtml>
       <invoiceId>1234</invoiceId>
       <customer>Hudsucker Industries</customer>
       <otherBusinessData>etc, etc</otherBusinessData>
    </invoice>
    

    我让它工作了,但是我必须在控制器中生成所有的actionHTML,这显然不是一个很好的关注分离,我丢失了所有的htmlhelper方法等等。所以我最终以“正确”的方式解决它的方法是:

    1. 使用webforms视图(我的页面使用盲文视图)【所以我可以使用contenttype page属性将其设置为xml】。
    2. 将原始业务对象的集合作为模型数据传递。
    3. 循环模型集合,为视图中的每个发票构建actonhtml元素(因此获取我的htmlhelper方法等)
    4. 要输出实际的业务元素,我可以简单地调用我的VB XML库并执行以下操作: invoice.ToXml().Elements().ToString() 我很好。

    为了进一步提高这个功能的可重用性,我创建了一个jqgrid主页面,它具有所有的记录计数,在内容区域中也是如此,这样我就可以在实际页面上传递这些信息,并且只需担心输出元素数据。