Какие умные вещи вы сделали с помощью ASP.NET Метода действия MVC
-
20-08-2019 - |
Вопрос
ASP.NET Методы действия контроллера MVC в основном используются для обработки "бизнес-" операций, но их можно использовать для гораздо большего.
Я подумал, что было бы забавно посмотреть, для каких творческих, полезных вещей люди создали действия, которые могут быть практичными или полезными для других.
Вот мой вклад :
Конкатенатор файлов Javascript - для уменьшите количество http-запросов:
[OutputCache(Duration = 5 * 60, VaryByParam="")] // DONT USE "None" here *
public ContentResult RenderJavascript(){
StringBuilder js = new StringBuilder();
StringWriter sw = new StringWriter(js);
// load all my javascript files
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/jquery.hoverIntent.minified.js")));
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/jquery.corner.js")));
js.AppendLine(File.ReadAllText(Request.MapPath("~/Scripts/rollingrazor.js")));
return new ContentResult()
{
Content = js.ToString(),
ContentType = "application/x-javascript"
};
}
Проложите к нему маршрут :
// javascript
routes.MapRoute(
"js-route",
"dynamic/js",
new { controller = "Application", action = "RenderJavascript" }
);
Обратитесь к нему со своей главной страницы :
<script type="text/javascript" src="/dynamic/js"></script>
Имейте в виду, я установил кэш для выходных данных, поэтому, если вы меняете свой JS и обновляете страницу, вы можете отключить кэш!
Мне просто нужно вернуться и выяснить, как его сжать.
*
Вы не должны использовать VaryByParam="None", потому что это приводит к отправке заголовка Vary, который заставляет браузер вернуться назад и проверить наличие новой версии.Если вам действительно нужно изменить свой js-контент, то вашим пользователям просто придется подождать этого 5 минут!
Решение
Делает ли Перенаправление HTTP 301 считать умным?
public class PermanentRedirectResult : ActionResult
{
public string Url { get; set; }
public PermanentRedirectResult(string url)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentException("url is null or empty", "url");
}
this.Url = url;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.HttpContext.Response.StatusCode = 301;
context.HttpContext.Response.RedirectLocation = Url;
}
}
Другие советы
Просмотреть результат с подтверждением по электронной почте:
public abstract class ViewResultWithConfirmationEmail: ViewResult
{
protected readonly string toAddress;
protected ViewResultWithConfirmationEmail(string toAddress)
{
this.toAddress = toAddress;
}
protected abstract MailMessage CreateEmail(ControllerContext context);
protected override void ExecuteResult(ControllerContext context)
{
MailMessage message = CreateEmail(context);
var smtpClient = new SmtpClient();
smtpClient.Send(message);
base.ExecuteResult(context);
}
}
Некоторые детали реализации здесь были опущены, но я мог бы использовать это для реализации RegistrationSuccessResult
класс, например, который отправил бы электронное сообщение с соответствующим текстом после успешной регистрации пользователя.
Причина, по которой я решил отправить сообщение в подклассе ViewResult, а не в самом методе action, заключалась в том, чтобы упростить разделение моих модульных тестов.
Частичная реализация Меньше, расширитель синтаксиса css
На самом деле он поддерживает только константы и то, что они называли миксинами, источник находится здесь.
В этот пост Я объяснил, как использовать его в mvc (сообщение на итальянском, но просто посмотрите на источник):
вы можете просто посмотреть вот в результате
На самом деле, не метод "действия", а пользовательский контроллер это реализует реализацию RPC на основе маршрута.Он идентифицирует контракт и метод из данных маршрута и передает вызов в реализацию службы на стороне сервера.Довольно эффективно (и да, есть веские причины, по которым я использую не только WCF или SOAP).
Не уверен, сколько из вас использует areas, но скрипт XCopy довольно необходим при внесении изменений в представление области.Области компилируются в родительский проект, но только при компиляции (не при сохранении), поэтому для сохранения гибкости разработки вам нужно будет запустить XCopy.