Asp.net mvc framework
Шрифт:
private static string MONTH_PREFIX = "month_";
private static string YEAR_PREFIX = "year_";
private static string ListItemToOption(SelectListItem item)
{
TagBuilder builder = new TagBuilder("option")
{
InnerHtml = HttpUtility.HtmlEncode(item.Text)
};
if (item.value != null)
builder.Attributes["value"] = item.Value;
if (item.Selected)
builder.Attributes["selected"] = "selected";
return builder.ToString(TagRenderMode.Normal);
}
private static string SelectList(string id,
List<SelectListItem> items)
{
StringBuilder listItemBuilder = new StringBuilder;
foreach (var item in items)
{
listItemBuilder.AppendLine(ListItemToOption(item));
}
TagBuilder tagBuilder = new TagBuilder("select")
{
InnerHtml = listItemBuilder.ToString
};
tagBuilder.Attributes.Add("id", id);
tagBuilder.Attributes.Add("name", id);
return tagBuilder.ToString(TagRenderMode.Normal);
}
public static string DatePicker(this HtmlHelper html, string id)
{
return DatePicker(html, id, String.Empty);
}
public static string DatePicker(this HtmlHelper html,
string id, string text)
{
// buffer
StringBuilder sb = new StringBuilder;
// generate days
List<SelectListItem> days = new List<SelectListItem>;
string dayValue = GetValue(html, DAY_PREFIX + id);
for (int i = 0; i <= 31; i++)
{
days.Add(new SelectListItem
{
Text = (i == 0) ? String.Empty : i.ToString,
Value = i.ToString,
Selected = (dayValue == i.ToString)
});
}
sb.AppendLine(SelectList(DAY_PREFIX + id, days));
// generate months
List<SelectListItem> months = new List<SelectListItem>;
string monthValue = GetValue(html, MONTH_PREFIX + id);
for (int i = 0; i <= 12; i++)
{
months.Add(new SelectListItem
{
Text = (i == 0) ? String.Empty :
DateTimeFormatInfo.CurrentInfo.MonthNames[i — 1],
Value = i.ToString,
Selected = (monthValue == i.ToString)
});
}
sb.AppendLine(SelectList(MONTH_PREFIX + id, months));
// generate years
List<SelectListItem> years = new List<SelectListItem>;
string yearValue = GetValue(html, YEAR_PREFIX + id);
for (int i = 1900; i <= DateTime.Now.Year; i++)
{
years.Add(new SelectListItem
{
Text = (i == 1900) ? String.Empty : i.ToString,
Value = i.ToString,
Selected = (yearValue == i.ToString)
});
}
sb.AppendLine(SelectList(YEAR_PREFIX + id, years));
// parent tag
if (!String.IsNullOrEmpty(text))
{
TagBuilder div = new TagBuilder("div");
div.Attributes.Add("id", id);
div.InnerHtml = text + sb.ToString;
sb = new StringBuilder(
div.ToString(TagRenderMode.Normal));
}
return sb.ToString;
}
private static string GetValue(HtmlHelper html, string id)
{
object o = null;
if (html.ViewData != null)
o = html.ViewData.Eval(id);
if (o == null)
o = html.ViewContext.RequestContext.HttpContext.Request.Params[id];
return (o == null) ? String.Empty : o.ToString;
}
}
В главе 2, в разд. "Использование элементов управления WebForms в MVC-приложениях” уже была продемонстрирована возможность применения серверных элементов управления в представлениях MVC. Как уже было сказано ранее, использование серверных элементов управления может быть оправдано, если не требуется интерактивное взаимодействие с соответствующим элементом, и он используется только для генерации разметки.
Несколько большую интерактивность взаимодействия с элементом управления можно реализовать за счет создания специального вспомогательного метода, взаимодействующего с этим элементом управления.
Сделать это можно просто, учитывая, что класс Webcontrol, которому наследуют классы конкретных элементов управления, содержит метод Render, генерирующий разметку. Как раз метод Render применяет инфраструктура WebForms для всех элементов управления на страницах. Пример использования элемента управления WebForms приведен в листинге 5.14.
Листинг 5.14. Пример использования класса Button во вспомогательном методе
public static class WebFormsHelper {
public static string WebFormsButton(this HtmlHelper html)
{
Button control = new Button { Text = "Web Forms Button" };
StringBuilder sb = new StringBuilder;
HtmlTextWriter htmlWriter = new HtmlTextWriter(
new StringWriter(sb));
control.RenderControl(htmlWriter);
return sb.ToString;
Архимаг. Пробуждение. Трилогия
56. В одном томе
Фантастика:
научная фантастика
рейтинг книги
Алексей Михайлович
4. Романовы. Династия в романах
Проза:
историческая проза
рейтинг книги
Антипсихология
Научно-образовательная:
психология
рейтинг книги