Я создаю свободный HtmlHelper в MVC - для создания сетки на основе HTML.Я знаю о mvc contrib и WebGrid - но я делаю свое собственное и у меня есть определенная проблема:
Я должен ввести это:
@Html.DSGridFor().AddColumn(x=>x.FirstOrDefault().Message)
, но я хочу иметь возможность печататьthis:
@Html.DSGridFor().AddColumn(x=>x.Message)
Код, который вызывается, когда я начинаю с @ Html.DSGridFor (), - берется в модели на основе страницы.
public static DSGridHelper<TModel> DSGridFor<TModel>(this HtmlHelper<TModel> html)
{
return new DSGridHelper<TModel>(html);
}
, а затем в классе DSGridHelper Iесть это:
public DSGridHelper<TModel> AddColumn(Expression<Func<TModel, dynamic>> property, string HeaderText = null)
{
string ColumnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = ColumnName;
DSGC.HeaderText = HeaderText ?? ColumnName;
DSColumnList.Add(DSGC);
return this;
}
public List<DSGridColumn> DSColumnList { get; set; }
и класс столбцов на данный момент действительно базовый:
public class DSGridColumn
{
public DSGridColumn()
{
}
public string ColumnName { get; set; }
public string HeaderText { get; set; }
}
Я могу заставить этот код работать нормально с именами столбцов на основе строк, но я хочу объявитькод на странице бритвы должен быть простым по формату и строго типизированным.На данный момент я должен набрать x => x.First (). Message, но мне действительно нужно только x => x.Message для идентификации столбца.
Я ценю любую помощь.
ОБНОВЛЕНИЕ
Благодаря Джастину я теперь могу предоставить мой / наш код.
Просмотр:
@(Html.DSGridFor3().AddColumn(x => x.Message)
.AddColumn(x => x.Host)
.ToMvcString())
HTML Helperвызов:
public static DSGridHelper3<T> DSGridFor3<T>(this HtmlHelper<IEnumerable<T>> htmlHelper)
{
return new DSGridHelper3<T>(htmlHelper);
}
Возвращаемый класс:
public class DSGridHelper3<T>
{
private HtmlHelper _htmlHelper;
//private IEnumerable<T> _dataList;
public List<DSGridColumn> DSColumnList { get; set; }
public DSGridHelper3(HtmlHelper<IEnumerable<T>> htmlHelper)
{
_htmlHelper = htmlHelper;
// _dataList = htmlHelper.ViewData.Model;
DSColumnList = new List<DSGridColumn>();
}
public DSGridHelper3<T> AddColumn(Expression<Func<T, object>> property)
{
string columnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = columnName;
DSGC.HeaderText = columnName;
DSColumnList.Add(DSGC);
return this;
}
public MvcHtmlString ToMvcString()
{
sb.Append("<table>");
sb.Append("<tr>");
sb.Append("<td>");
sb.Append("hello world within a table");
sb.Append(@"</td>");
sb.Append("<td>");
sb.Append("hello world within a table");
sb.Append(@"</td>");
sb.Append(@"</tr>");
sb.Append(@"</table>");
return new MvcHtmlString(sb.ToString());
}
}
ОБНОВЛЕНИЕ 2
Если вы хотите вручную вставить другой тип (возможно, потому что высобираемся получить небольшое количество табличных данных из ViewData, а не из модели страницы), а вот еще немного кода:
View:
@(Html.DSGridFor3<DanSoftware.MVC.Areas.Errors.Code.ELMAH_Error>().AddColumn(x => x.Message).ToMvcString();)
Альтернативная подпись для DSGridHelper...helper
public static DSGridHelper3<T> DSGridFor3<T>(this HtmlHelper htmlHelper)
{
return new DSGridHelper3<T>(htmlHelper);
}
Дополнительный конструктор:
public DSGridHelper3(HtmlHelper htmlHelper)
{
_htmlHelper = htmlHelper;
// _dataList = htmlHelper.ViewData.Model;
DSColumnList = new List<DSGridColumn>();
}
Надеюсь, это кому-нибудь поможет и спасибо Джастину!