Записи с тегом «ASP.NET-MVC»
Значение по умолчанию для select'а в ASP.NET MVC
Иногда возникает необходимость добавить в выпадающий список (<select />) ещё один пункт с пустым атрибутом value и примерно таким текстом: «выберите, пожалуйста, значение». Обычно такой пункт размещается в выпадающем списке первым. Специально для этого случая существуют специальные версии методов Html.DropDownList() и Html.DropDownListFor(), которые позволяют указать текст этого <option>'а следующим образом:
<%: Html.DropDownListFor(m => m.MyModelField, Model.ListOfOptions, "— не выбрано") %>
Универсальный пейджер для ASP.NET MVC
Практически в каждом веб-проекте необходим т.н. пейджер — элемент интерфейса, с помощью обеспечивается навигация по страницам списка каких-либо элементов. Для подобной функциональности, которая повторяется из проекта в проект, удобно сделать более-менее универсальное решение. Наша реализация должна была удовлетворять таким требованиям:
- Нумерация страниц с единицы
- HTML-код пейджера в виде Partial View
- Отсутствие привязки к какому либо конкретному способу передачи номера текущей страницы в URL и к правилам роутинга
- Возможность использования пейджера с любым источником данных (LINQ2SQL-запрос, ADO.NET-запрос и т.п.), т.е. возможность реализации собственного алгоритма выборки страницы данных
Итогом решения будет набор из ViewModel-классов и View-файлов в двух вариантах: WebForms View Engine и Razor.
Интересно, реально ли оформить решения в виде пакета NuGet?
Указание неймспейсов для view-файлов ASP.NET MVC в формате Razor
В приложениях на Web Forms и на ASP.NET MVC с использованием view в формате .aspx можно было указать нужные неймспейсы, которые будут доступны в шаблонах с помощью такой конструкции в Web.config:
<pages> <namespaces> ... <add namespace="Snippets.Helpers"/> <add namespace="Snippets.Models.ViewModel"/> ... </namespaces> </pages>
Для Razor'а используется другая процедура компиляции шаблонов, поэтому эти параметры на него не влияют.
Вставка кода счётчиков по условию в ASP.NET MVC
Для того, чтобы код счётчиков не мешал разработке на локальной машине удобно вставлять его во view с помощью такой проверки (при условии, что на «живой» версии приложения установлен параметр <compilation debug="false" /> как это и должно быть):
<% if (!HttpContext.Current.IsDebuggingEnabled) { %>
<!-- Google Analytics code -->
<script type="text/javascript">
// ...
</script>
<!-- /Google Analytics code -->
<% } %>
Скорее всего, можно использовать и проверку по свойству HttpRequest.IsLocal.
Шаблоны e-mail'ов в ASP.NET MVC
По аналогии с решением для WebForms, в ASP.NET MVC можно использовать для генерации текста e-mail'ов обычные view. Работающее решение нашлось на одном, к сожалению, не отзывающемся сейчас сайте.
nl2br() для ASP.NET MVC
Упрощённый аналог PHP-функции nl2br(), оформленный в виде extension-метода к helper'у ASP.NET MVC:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Linq.Expressions;
namespace CrispStudio.Helpers
{
public static class HtmlNl2BrExtensions
{
public static string Nl2br(this HtmlHelper html, string input)
{
return input.Replace(Environment.NewLine, "<br />\r\n");
}
}
}
Пример использования:
<div> <%= Html.Nl2br(Html.Encode(Model.Text)) %> </div>
О возможных усовершенствованиях (поддержке всех типов переводов строк, например) можно прочесть на StackOverflow.
Валидация запроса в ASP.NET 4.0
В ASP.NET 4.0 одно из изменений со статусом «breaking change» приводит к тому, что ошибки валидации появляются для проектов на ASP.NET MVC на action'ах с атрибутом [AllowHtml] и даже для проектов на Web Forms с такой директивой в Web.config:
<pages validateRequest="false">
Решение проблемы следующее: необходимо добавить в Web.config в секцию <system.web />:
<httpRuntime requestValidationMode="2.0"/>
После указания этого параметра для проектов на Web Forms как и раньше можно управлять валидацией с помощью директивы <pages validateRequest="false"> в Web.config или избирательно отключать валидацию на уровне aspx-страницы.
Для ASP.NET MVC управление валидацией запроса можно осуществлять с помощью атрибутов [ValidateInput] и [AllowHtml]
В уже упомянутом посте говорится, что для ASP.NET MVC 3 этот параметр устанавливать необязательно.
ASP.NET 4.0 на IIS6
Для того, чтобы запустить ASP.NET 4.0 на IIS6 нужно предпринять несколько не совсем очевидных действий.
Генерация CSV из ASP.NET MVC приложения
Интересный метод генерации CSV из ASP.NET MVC с помощью класса-наследника System.Web.Mvc.FileResult. Плюсы решения:
- Используется стандартный класс ASP.NET MVC для генерации файла для скачивания
- CSV можно сгенерировать практически из любой коллекции объектов
- Заголовки колонок генерируются из значений атрибутов
[DisplayName] - Можно указать имена свойств, которые не нужно экспортировать
Похоже, в оригинальном коде есть ошибка — исключение полей из набора не работало как нужно. К сожалению, комментарии к оригинальной статье закрыты, исправленный вариант кода ниже.
Получение значения атрибута DisplayName в контроллере ASP.NET MVC
Дополнение от 29.03.2011: Код обновлён для поддержки метаданных, определённых с помощью partial-классов и атрибута [MetadataType]
В случае, если для снабжения модели ASP.NET MVC приложения метаданными используются DataAnnotations, например так:
public class MyViewModel
{
[DisplayName("Имя пользователя")]
public string UserName { get; set; }
...
}
Для программного получения значения атрибута [DisplayName], например, в коде контроллера, можно воспользоваться следующим методом (оригинал решения):
public static class MetaDataHelper
{
public static string GetDisplayName(Type dataType, string fieldName)
{
// First look into attributes on a type and it's parents
DisplayNameAttribute attr;
attr = (DisplayNameAttribute)dataType.GetProperty(fieldName).GetCustomAttributes(typeof(DisplayNameAttribute), true).SingleOrDefault();
// Look for [MetadataType] attribute in type hierarchy
// http://stackoverflow.com/questions/1910532/attribute-isdefined-doesnt-see-attributes-applied-with-metadatatype-class
if (attr == null)
{
MetadataTypeAttribute metadataType = (MetadataTypeAttribute)dataType.GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault();
if (metadataType != null)
{
var property = metadataType.MetadataClassType.GetProperty(fieldName);
if (property != null)
{
attr = (DisplayNameAttribute)property.GetCustomAttributes(typeof(DisplayNameAttribute), true).SingleOrDefault();
}
}
}
return (attr != null) ? attr.DisplayName : String.Empty;
}
}
Пример использования:
string fieldDisplayName = MetaDataHelper.GetDisplayName(typeof(MyViewModel), "UserName");
Минус решения — имя поля приходится указывать в виде строки, возможно и строго типизированное решение.
