SORU
28 NİSAN 2009, Salı


Nasıl Server simüle etmek için.ASP.NET MVC Transfer?

ASP.NET MVC yeniden bir ActionResult kolayca iade edebilirsiniz :

 return RedirectToAction("Index");

 or

 return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });

Bu aslında normalde güzel olan bir HTTP yeniden yönlendirme, verecektir. Google analytics kullanırken ancak, bu orijinal başvurmak google bakmıyor nereden geldiğini öğrenmek çok kayıp olduğu için büyük sorunlara neden olur. Bu herhangi bir arama motoru şart gibi yararlı bilgiler kaybeder.

Bir yan not olarak, bu yöntem kampanyaları gelmiş olabilecek herhangi bir parametre çıkarma avantajı vardır ama yine de bana bunları sunucu tarafı yakalamak için izin verir. Sorgu dize bırakarak onları insanlar imleme veya twitter neden veya yapmaması gereken bir bağlantı blog. Bu insanlar site içeren kampanya Kimlikleri bağlantılar twittered olduğu birkaç kez gördüm.

Her neyse, bir 'ağ geçidi' gelen tüm denetleyici farklı yerlerde veya alternatif sürümlerini yeniden yönlendirme olabilirim sitesini ziyaret etti. yazıyorum

Şimdi ben bakımı hakkında daha fazla Google şimdi (daha kaza imleme), ve istiyorum edebilmek için birini gönderir kim ziyaret etti / sayfa edeceklerini olursa gittiler /home/7, sürüm 7 Bir ana sayfa.

Eğer bunu yaparsam google başvurmak analiz etmek için yeteneğini kaybetmeden önce dedim

 return RedirectToAction(new { controller = "home", version = 7 });

Ben gerçekten ne istediğini

 return ServerTransferAction(new { controller = "home", version = 7 });

benim istemci tarafında Yeniden Yönlendirme Olmadan görünüm elde edecek. Böyle bir şey olduğunu sanmıyorum.

Şu anda aklıma gelen en iyi şey GatewayController.Index benim Eylem HomeController.Index(..) bütün kumanda mantığı çoğaltmak için. Bu erişilebilir oldu 'Views/Home' 'Shared' taşınmak zorundaydım. Daha iyi bir yolu olmalı??..

CEVAP
25 Temmuz 2009, CUMARTESİ


Hakkında TransferResult bir sınıf? (Stans answer bağlı olarak)

/// <summary>
/// Transfers execution to the supplied url.
/// </summary>
public class TransferResult : ActionResult
{
    public string Url { get; private set; }

    public TransferResult(string url)
    {
        this.Url = url;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var httpContext = HttpContext.Current;

        // MVC 3 running on IIS 7 
        if (HttpRuntime.UsingIntegratedPipeline)
        {
            httpContext.Server.TransferRequest(this.Url, true);
        }
        else
        {
            // Pre MVC 3
            httpContext.RewritePath(this.Url, false);

            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(httpContext);
        }
    }
}

Güncelleme:Şimdi MVC3 (Simon's post kod kullanarak) ile çalışır.gerekir(bunu test etmek mümkün olmamıştır) ya da IIS7 entegre boru hattı içinde çalışan olup olmadığını bakarak MVC2 çalışın .

Tam şeffaflık için; üretim ortamında asla doğrudan TransferResult ihtiyacımız var. Sırayla TransferResult yürütür çağıran bir TransferToRouteResult kullanıyoruz. Burada aslında üretim sunucuları üzerinde çalışıyor.

public class TransferToRouteResult : ActionResult
{
    public string RouteName { get;set; }
    public RouteValueDictionary RouteValues { get; set; }

    public TransferToRouteResult(RouteValueDictionary routeValues)
        : this(null, routeValues)
    {
    }

    public TransferToRouteResult(string routeName, RouteValueDictionary routeValues)
    {
        this.RouteName = routeName ?? string.Empty;
        this.RouteValues = routeValues ?? new RouteValueDictionary();
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var urlHelper = new UrlHelper(context.RequestContext);
        var url = urlHelper.RouteUrl(this.RouteName, this.RouteValues);

        var actualResult = new TransferResult(url);
        actualResult.ExecuteResult(context);
    }
}

Ve eğer T4MVC kullanıyorsanız... yoksa değil (!) bu eklenti işe yarayabilir.

public static class ControllerExtensions
{
    public static TransferToRouteResult TransferToAction(this Controller controller, ActionResult result)
    {
        return new TransferToRouteResult(result.GetRouteValueDictionary());
    }
}

Bu küçük taş kullanarak yapabilirsiniz

// in an action method
TransferToAction(MVC.Error.Index());

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • circuschina

    circuschina

    16 Mart 2007
  • funbro1

    funbro1

    11 Aralık 2007
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007