【问题标题】:What clever things have you done with an ASP.NET MVC Action method你用 ASP.NET MVC Action 方法做了什么聪明的事
【发布时间】:2010-10-03 22:02:09
【问题描述】:

ASP.NET MVC 控制器操作方法主要用于处理“业务”操作,但它可以用于更多。

我认为看看人们创造了哪些创意、有用的东西可能对其他人实用或有用的行为会很有趣。

这是我的贡献:

Javascript 文件连接器 - 到 reduce number of http requests:

    [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 标头,causes the browser to go back and check for a new version。如果你真的要更改你的 js 内容,那么你的用户只需要等待 5 分钟!

【问题讨论】:

  • 哈!此代码实际上因 RC1 而失败。他们在 Controller 上添加了一个新的 File() 方法,这意味着您需要将 File 替换为 System.IO.File
  • .NET 3.5 SP1 脚本组合不能在这里工作吗? asp.net/Learn/3.5-SP1/video-296.aspx
  • 如果可以根据每个页面上需要的脚本文件进行更改以动态呈现脚本文件,那就更好了。
  • 哎呀!我认为这是我关于 HtmlExtension 方法的聪明事情的问题,我只是给了它 150 赏金。哦,好吧!
  • 对于资产管理,请查看此方法:weblogs.asp.net/rashid/archive/2009/05/02/…

标签: .net asp.net-mvc actionmethod


【解决方案1】:

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;
    }
}

【讨论】:

  • 当然 :) 现在你必须投票给我,虽然我总是害怕那些 301 件事,但我相信我会在接下来的 24 小时内突然发现需要一个!
【解决方案2】:

通过电子邮件确认查看结果:

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 中而不是在操作方法本身中发送消息的原因是为了更容易分离我的单元测试。

【讨论】:

    【解决方案3】:

    less 的部分实现,一个 css 语法扩展器

    它实际上只支持常量和他们所谓的 mixins,the source are here

    this post我解释了如何在mvc中使用它(帖子是意大利语的,但是看源码):

    你可以看看 here at the result

    【讨论】:

      【解决方案4】:

      其实不是一个“action”方法,而是一个自定义的controller,它实现了一个基于路由的RPC实现。它从路由数据中识别合约和方法,并将调用传递给服务器端服务实现。非常有效(是的,有正当理由我不只是使用 WCF 或 SOAP)。

      【讨论】:

        【解决方案5】:

        不确定有多少人在使用区域,但在区域中进行视图更改时,XCopy 脚本是非常必要的。区域编译到父项目中,但仅在编译时(不是在保存时),因此为了保持开发敏捷性,您需要运行 XCopy。

        【讨论】:

        • 你是说动作方法本身调用 XCopy ?有趣的想法(只要它仅在开发阶段启用)。很好的解决问题。由于这个限制,我避免了单独的区域项目
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        相关资源
        最近更新 更多