Какие умные вещи вы сделали с помощью метода ASP.NET MVC Action - PullRequest
24 голосов
/ 28 января 2009

Методы действия контроллера 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 минут!

Ответы [ 5 ]

14 голосов
/ 28 января 2009

Считает ли HTTP 301 Redirect умным?

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;
    }
}
3 голосов
/ 24 июня 2009

Частичная реализация меньше , расширение синтаксиса CSS

Он на самом деле поддерживает только константы и то, что они называют миксинами, источник здесь .

В этом посте Я объяснил, как использовать его в MVC (пост на итальянском, но просто посмотрите на источник):

можешь просто посмотреть здесь, в результате

3 голосов
/ 20 июня 2009

Просмотр результатов с подтверждением по электронной почте:

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, а не в самом методе действия, заключалась в упрощении разделения моих модульных тестов.

2 голосов
/ 18 июня 2009

На самом деле, это не метод "action", а пользовательский контроллер , который реализует реализацию RPC на основе маршрута. Он идентифицирует контракт и метод из данных маршрута и передает вызов реализации службы на стороне сервера. Довольно эффективно (и да, есть веские причины, по которым я не просто использую WCF или SOAP).

0 голосов
/ 09 сентября 2009

Не уверен, сколько из вас использует области, но сценарий XCopy весьма необходим при внесении изменений в Просмотр в области. Области компилируются в родительский проект, но только при компиляции (не при сохранении), поэтому для обеспечения гибкости вам необходимо запустить XCopy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...