c# – 为IEnumerable编写MVC HtmlHelper以显示HTML表

c# – 为IEnumerable编写MVC HtmlHelper以显示HTML表,第1张

概述我正在尝试编写一个客户 HtmlHelper,它允许从传递IEnumerable< TModel>的视图中轻松创建Html表.其中TModel是模型对象类型.我希望视图中的调用语法是样式的: @Html.TableFor(model => model.AddedUserID, model => model.ClientID......., model model => AnothreFildIWa 我正在尝试编写一个客户 HtmlHelper,它允许从传递IEnumerable< TModel>的视图中轻松创建HTML表.其中TModel是模型对象类型.我希望视图中的调用语法是样式的:

@HTML.tableFor(model => model.AddedUserID,model => model.ClIEntID.......,model model => AnothrefildIWantdisplayed));

我首先尝试使用一个表达式首先传递,例如,

@HTML.tableFor(model => model.AddedUserID)

一旦有效,我将使用params并使用多个表达式来获得逗号分隔列表.

我的VIEw代码如下所示

@using MynameSpacetoMyHelper@model IEnumerable<User>@{    VIEwBag.Title = "Index";}<p></p>@HTML.tableFor(model => model.AddedUserID));

我编写HTMLHelper的尝试是:

using System;using System.Collections.Generic;using System.IO;using System.linq;using System.linq.Expressions;using System.Text;using System.Threading.Tasks;using System.Web;using System.Web.Mvc;using System.Web.Mvc.HTML;using System.Web.UI;namespace MynameSpacetoMyHelper{    public static class GrIDExtensions    {        public static MvcHTMLString tableFor<TModel,TValue>(this HTMLHelper<IEnumerable<TModel>> HTML,Expression<Func<TModel,TValue>> Expression)        {            var writer = new HTMLTextWriter(new StringWriter());            writer.RenderBeginTag(HTMLTextWriterTag.table);            writer.RenderBeginTag(HTMLTextWriterTag.Thead);            writer.RenderBeginTag(HTMLTextWriterTag.Th);            writer.RenderBeginTag(HTMLTextWriterTag.Td);            //Colum headers            writer.Write(HTML.displaynameFor(Expression));            writer.RenderEndTag();            writer.RenderEndTag();            writer.RenderEndTag();//Close Thead            //Column Data            //HTML.displayFor((Expression<Func<TModel,TValue>>)Expression);            foreach (VIEwDataDictionary<TModel> vdm in HTML.VIEwData.Values)            {                writer.RenderBeginTag(HTMLTextWriterTag.Tr);                writer.RenderBeginTag(HTMLTextWriterTag.Td);                //DOESN'T COMPILE                HTML.displayFor(Expression);                writer.RenderEndTag();                writer.RenderEndTag();            }            writer.RenderEndTag(); //Close header            return new MvcHTMLString(writer.InnerWriter.ToString());        }   }}

由于以下原因,这不能编译:

HTML.displayFor(表达);

据我所知,这是因为传递给我的方法的HTMLHelper是针对HTMLHelper< IEnumerable< TModel>>而当使用displayFor时,它需要是HTMLHelper< TModel>.

由于这个错误,似乎可以通过将表头和数据拆分为两个单独的方法调用来实现这一点.从我的视图中我可以调用header方法然后在实际视图中有一个for循环,它为每个调用一个方法一排什么的.像这样的东西

@using MynameSpacetoMyHelper@model IEnumerable<User>@{    VIEwBag.Title = "Index";}<p></p>@HTML.tableheadersFor(model => model.AddedUserID));@foreach (var item in Model) {       @HTML.tableRowsFor(model => model.AddedUserID));}

这应该有效,因为tableheadersFor可以调用displaynameExtensions.displaynameFor,它接受HTMLHelper< IEnumerable< TModel>>和tableRowsFor可以采用HTMLHelper< TModel>并使用HTMLHelper< TModel>调用displayExtensions.displayFor.所以不兼容的HTMLHelper类型问题就会消失.

但是,如果可能的话,我不希望这样做,因为我希望调用语法尽可能简单.我的问题的一个基本前提是尝试维护一个简单的调用语法,而无需在视图中编写for循环并复制用于选择列的表达式.这里的全部目的是设计一些可重复使用且易于使用的东西

我在ILSpy中看了一下displaynameExtensions.displaynameFor是如何工作的,因为它处理HTMLHelper< IEnumerable< TModel>>因为它看起来像是一种采用HTMLHelper< IEnuermable< TModel>>的exstension方法.在内部调用HTMLHelper上的扩展方法< TModel>但是ILSpy正在生成的代码甚至没有重新编译,因此我无法理解.Net是如何做到这一点的.

这在一种扩展方法中是可能的还是我会被迫拆分它以破坏调用语法?

更新1
我已经成功完成了以下工作:

@HTML.BegintableFor(model => model.AddedUserID,model => model.Active,new { @class = "grID" })@foreach (var item in Model) {    @HTML.displayRowFor(model => item.AddedUserID,model => item.Active)}@HTML.EndtableFor()

它并不像我想的那样简洁并涉及一堆工作,特别是因为BegintableFor和displayRowFor的每个表达式都可以返回不同的类型,这意味着我基本上必须为任意数量的表达式实现一个方法重载(我已经完成了100个所以最多可以工作100列!).这基本上是他们在.Net中使用Action和Func委托的问题,他们必须为不同数量的参数编写不同的版本,例如动作T1,T2,..,T16.它显然非常混乱,但我宁愿有很好的调用语法,而不是避免许多方法重载.

解决方法 看看 this article的某个方向,并根据您的需要进行修改.

首先,您需要这样的HTML扩展:

public static class RazorExtensions {    public static HelperResult List<T>(this IEnumerable<T> items,Func<T,HelperResult> template) {        return new HelperResult(writer => {            foreach (var item in items) {                template(item).Writeto(writer);            }        });    }}

然后在HTML中,您可以执行以下 *** 作:

{    var comics = new[] {         new ComicBook {Title = "Groo",Publisher = "Dark Horse Comics"},new ComicBook {Title = "SpIDerman",Publisher = "Marvel"}    };}<table>@comics.List(  @<tr>    <td>@item.Title</td>    <td>@item.Publisher</td>  </tr>)</table>
总结

以上是内存溢出为你收集整理的c# – 为IEnumerable编写MVC HtmlHelper以显示HTML表全部内容,希望文章能够帮你解决c# – 为IEnumerable编写MVC HtmlHelper以显示HTML表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存