ASP.NET MVC'de Server.Transfer benzetimi nasıl yapılır?


124

ASP.NET MVC'de bir yeniden yönlendirme ActionResult'u oldukça kolay bir şekilde döndürebilirsiniz:

 return RedirectToAction("Index");

 or

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

Bu aslında normalde iyi olan bir HTTP yönlendirmesi verecektir. Ancak, google analytics'i kullanırken bu büyük sorunlara neden olur çünkü orijinal yönlendirici kaybolur, bu nedenle google nereden geldiğinizi bilemez. Bu, herhangi bir arama motoru terimi gibi yararlı bilgileri kaybeder.

Bir yan not olarak, bu yöntemin, kampanyalardan gelmiş olabilecek tüm parametreleri kaldırma avantajı vardır, ancak yine de onları sunucu tarafında yakalamama izin verir. Bunları sorgu dizesinde bırakmak, insanların yer işareti koymasına veya Twitter'da veya blogda yapmaması gereken bir bağlantıyı oluşturmasına yol açar. Bunu, insanların sitemize kampanya kimlikleri içeren twitter bağlantılarını paylaştığı birkaç kez gördüm.

Her neyse, siteye gelen tüm ziyaretler için farklı yerlere veya alternatif sürümlere yönlendirebileceğim bir 'ağ geçidi' denetleyicisi yazıyorum.

Şimdilik Google'ı daha çok önemsiyorum (yanlışlıkla yer işaretlemekten ziyade) ve bir ana sayfanın 7. sürümü olan, /gitmeleri durumunda alabilecekleri sayfayı ziyaret eden birini gönderebilmek istiyorum /home/7.

Daha önce de söylediğim gibi Bunu yaparsam, Google'ın yönlendireni analiz etme yeteneğini kaybederim:

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

Gerçekten istediğim şey

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

bu da bana müşteri tarafı yönlendirmesi olmadan bu görünümü sağlayacak. Yine de böyle bir şeyin var olduğunu düşünmüyorum.

Şu anda elde edebilirsiniz en iyi şey için tüm kontrolör mantığı çoğaltmak için HomeController.Index(..)benim de GatewayController.IndexEylem. Bu benim taşımak zorunda anlamına 'Views/Home'içine 'Shared'erişilebilir oldu. Daha iyi bir yolu olmalı ?? ..


ServerTransferActionKopyalamaya çalıştığınız şey tam olarak nedir ? Bu gerçek bir şey mi? (hakkında herhangi bir bilgi bulamadım ... soru için teşekkürler, btw, aşağıdaki cevap mükemmel)
jleach

Server.Transfer (...) konusuna bakın. Bu, istemcinin yeniden yönlendirilen sayfayı istemci tarafı yeniden yönlendirmesi olmadan aldığı sunucu tarafında temelde bir 'yeniden yönlendirme' yapmanın bir yoludur. Genellikle modern yönlendirmede önerilmez.
Simon_Weaver

1
"Aktarma", yönlendirmeyi kullanarak doğrudan doğru denetleyici eylemine gitme yeteneği nedeniyle artık MVC'de gerekli olmayan eski bir ASP.NET özelliğidir . Ayrıntılar için bu yanıta bakın.
NightOwl888

@ NightOwl888 kesinlikle evet - ama bazen iş mantığı nedeniyle gerekli / daha kolay. Bunu nerede kullandığımı görmek için geriye dönüp baktım - (neyse ki tek bir yerdeydi) - burada belirli karmaşık koşullar için dinamik olmasını istediğim bir ana sayfam var ve bu nedenle perde arkasında farklı bir yol gösteriyor. Kesinlikle rota veya rota koşulları lehine mümkün olduğunca bundan kaçınmak istersiniz - ancak bazen basit bir ififade bir çözüm için çok cazip olabilir.
Simon_Weaver

@Simon_Weaver - Ve bir denetleyiciden diğerine atlamak için her şeyi geriye doğru bükmek yerine ifadenizi oraya RouteBasekoyabilmeniz için alt sınıflandırma yapmanın nesi yanlış if?
NightOwl888

Yanıtlar:


130

TransferResult sınıfına ne dersiniz? ( Stans cevabına göre )

/// <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üncellendi: Artık MVC3 ile çalışıyor ( Simon'ın gönderisindeki kodu kullanarak ). Gerektiğini bunun IIS7 + 'nın entegre boru hattı içinde çalışıyor olsa da olmasa bakarak da MVC2 iş (bunu test etmek mümkün olmamıştır).

Tam şeffaflık için; Üretim ortamımızda TransferResult'u asla doğrudan kullanmıyoruz. Bir TransferToRouteResult kullanıyoruz, bu da çağrılarda TransferResult'u çalıştırır. İşte üretim sunucularımda aslında çalışan şey.

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 T4MVC kullanıyorsanız ( kullanmıyorsanız ... yapın!) Bu uzantı kullanışlı olabilir.

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

Bu küçük mücevheri kullanarak yapabilirsin

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

1
bu harika çalışıyor. Sonsuz bir döngü ile sonuçlanmamaya dikkat edin - ilk denememde yanlış URL'yi girerek yaptığım gibi. Başkaları için yararlı olabilecek bir rota değeri koleksiyonunun aktarılmasına izin vermek için küçük bir değişiklik yaptım. yukarıda veya aşağıda yayınlandı ...
Simon_Weaver

güncelleme: bu çözüm iyi çalışıyor gibi görünüyor ve onu yalnızca çok sınırlı bir kapasitede
kullansam

bir sorun: POST'tan GET isteğine yönlendirme yapılamaz - ancak bu mutlaka kötü bir şey değildir. yine de dikkatli olunması gereken bir şey
Simon_Weaver

2
@BradLaney: Sadece 'var urlHelper ...' ve 'var url ...' satırlarını kaldırıp geri kalanı için 'url'yi' this.Url 'ile değiştirebilirsiniz ve işe yarıyor. :)
Michael Ulmann

1
1: kaplin / birim testi / gelecekteki uyumluluk. 2: mvc çekirdek / mvc örnekleri asla bu tekliği kullanmaz. 3: bu tekil bir iş parçacığında (boş), bir havuz iş parçacığında veya zaman uyumsuz eylem yöntemlerini kullanırken olduğu gibi, varsayılandan farklı bir bağlamda çağrılan bir zaman uyumsuz temsilcide kullanılamaz. 4: yalnızca uyumluluk amacıyla, mvc bu tekli değeri, kullanıcı kodunu girmeden önce context.HttpContext olarak ayarlar.
Softlion

47

Düzenleme: ASP.NET MVC 3 ile uyumlu olacak şekilde güncellendi

IIS7 kullanıyorsanız, aşağıdaki değişiklik ASP.NET MVC 3 için işe yarıyor gibi görünüyor. @Nitin ve @andy'ye, orijinal kodun çalışmadığını belirttikleri için teşekkürler.

Edit 4/11/2011: TempData, MVC 3 RTM'den itibaren Server.TransferRequest ile kesiliyor

Bir istisna atmak için aşağıdaki kodu değiştirdik - ancak şu anda başka bir çözüm yok.


İşte Markus'un Stan'in orijinal gönderisinin değiştirilmiş versiyonuna dayanan değişikliğim. Yol Değeri sözlüğünü almak için ek bir kurucu ekledim ve yalnızca bir yönlendirme olabileceğine dair kafa karışıklığını önlemek için MVCTransferResult olarak yeniden adlandırdım.

Artık yönlendirme için aşağıdakileri yapabilirim:

return new MVCTransferResult(new {controller = "home", action = "something" });

Değiştirilmiş sınıfım:

public class MVCTransferResult : RedirectResult
{
    public MVCTransferResult(string url)
        : base(url)
    {
    }

    public MVCTransferResult(object routeValues):base(GetRouteURL(routeValues))
    {
    }

    private static string GetRouteURL(object routeValues)
    {
        UrlHelper url = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()), RouteTable.Routes);
        return url.RouteUrl(routeValues);
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var httpContext = HttpContext.Current;

        // ASP.NET MVC 3.0
        if (context.Controller.TempData != null && 
            context.Controller.TempData.Count() > 0)
        {
            throw new ApplicationException("TempData won't work with Server.TransferRequest!");
        }

        httpContext.Server.TransferRequest(Url, true); // change to false to pass query string parameters if you have already processed them

        // ASP.NET MVC 2.0
        //httpContext.RewritePath(Url, false);
        //IHttpHandler httpHandler = new MvcHttpHandler();
        //httpHandler.ProcessRequest(HttpContext.Current);
    }
}

1
Bu MVC 3 RC'de çalışmıyor gibi görünüyor. HttpHandler.ProcessRequest () üzerinde başarısız olur, diyor ki: 'HttpContext.SetSessionStateBehavior' yalnızca 'HttpApplication.AcquireRequestState' olayı başlatılmadan önce çağrılabilir.
Andy

MVC3'e bakmak için henüz bir değişiklik yapmadım. bir çözüm bulursan bana haber ver
Simon_Weaver

Nitin tarafından önerildiği gibi Server.TransferRquest yukarıdakilerin yapmaya çalıştığı şeyi yapıyor mu?
Yaşlı Geezer

Neden TempData'yı null için kontrol etmemiz ve> 0 saymamız gerekiyor?
yurart

Yapmıyorsun, ama bu sadece bir güvenlik özelliğidir, bu yüzden onu zaten kullanıyorsan ve ona güveniyorsan, kaybolursa başını kaşımak zorunda kalmazsın
kaşıymayacaksın Simon_Weaver


12

Yakın zamanda ASP.NET MVC'nin Server.Transfer () 'i desteklemediğini öğrendim, bu yüzden bir saplama yöntemi oluşturdum (Default.aspx.cs'den esinlenerek).

    private void Transfer(string url)
    {
        // Create URI builder
        var uriBuilder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, Request.ApplicationPath);
        // Add destination URI
        uriBuilder.Path += url;
        // Because UriBuilder escapes URI decode before passing as an argument
        string path = Server.UrlDecode(uriBuilder.Uri.PathAndQuery);
        // Rewrite path
        HttpContext.Current.RewritePath(path, false);
        IHttpHandler httpHandler = new MvcHttpHandler();
        // Process request
        httpHandler.ProcessRequest(HttpContext.Current);
    }

9

Yönlendirmek istediğiniz denetleyicinin bir örneğini oluşturup, istediğiniz eylem yöntemini çağırıp ardından bunun sonucunu döndüremez misiniz? Gibi bir şey:

 HomeController controller = new HomeController();
 return controller.Index();

4
Hayır, oluşturduğunuz denetleyicinin üzerinde İstek ve Yanıt kurulumu gibi şeyler doğru şekilde olmayacaktır. Bu sorunlara yol açabilir.
Jeff Walker Code Ranger

@JeffWalkerCodeRanger'a katılıyorum: özelliği ayarladıktan sonra da aynı şeyotherController.ControllerContext = this.ControllerContext;
T-moty

7

Yürütme yolunu, bu ikinci denetleyicinin / eylemin talep edildiği gibi tam olarak aynı tutarken, mevcut isteği başka bir denetleyiciye / eyleme yeniden yönlendirmek istedim. Benim durumumda, Server.Request çalışmaz çünkü daha fazla veri eklemek istedim. Bu aslında geçerli işleyicinin başka bir HTTP GET / POST'u çalıştırması ve ardından sonuçları istemciye aktarmasıyla eşdeğerdir. Bunu başarmanın daha iyi yolları olacağına eminim, ama işte benim için işe yarayan şey:

RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Public");
routeData.Values.Add("action", "ErrorInternal");
routeData.Values.Add("Exception", filterContext.Exception);

var context = new HttpContextWrapper(System.Web.HttpContext.Current);
var request = new RequestContext(context, routeData);

IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(filterContext.RequestContext, "Public");
controller.Execute(request);

Tahminin doğru: Bu kodu koydum

public class RedirectOnErrorAttribute : ActionFilterAttribute, IExceptionFilter

ve bunu, üretimde normal bir yeniden yönlendirme kullanırken geliştiricilere hataları görüntülemek için kullanıyorum. ASP.NET oturumunu, veritabanını veya istekler arasında özel durum verilerini geçirmenin başka yollarını kullanmak istemediğimi unutmayın.


7

Aksine benzetmek bir sunucu transferi yerine, MVC hala aslında yapma yeteneğine sahip Server.TransferRequest :

public ActionResult Whatever()
{
    string url = //...
    Request.RequestContext.HttpContext.Server.TransferRequest(url);
    return Content("success");//Doesn't actually get returned
}

Daha fazla açıklamak için cevabınıza biraz metin eklemekten çekinmeyin.
Wladimir Palant

Bunun MVCv3 ve üstünü gerektirdiğini unutmayın.
Seph

5

Sadece diğer denetleyiciyi örnekleyin ve eylem yöntemini çalıştırın.


Bu, istenen URL'yi adres çubuğunda göstermeyecek
arserbin3

@ arserbin3 - Server.Transfer da olmayacak. Bu gereklilik, muhtemelen asıl sorunun neden gönderildiğidir.
Richard Szalay

2

Diğer denetleyiciyi yenileyebilir ve sonucu döndüren eylem yöntemini çağırabilirsiniz. Ancak bu, görünümünüzü paylaşılan klasöre yerleştirmenizi gerektirir.

Yineleme derken kastettiğin bu mu emin değilim ama:

return new HomeController().Index();

Düzenle

Başka bir seçenek de kendi ControllerFactory'nizi oluşturmak olabilir, bu şekilde hangi kontrolcüyü yaratacağınızı belirleyebilirsiniz.


Bu yaklaşım olabilir, ancak bağlamı tam olarak doğru görünmüyor - hc.ControllerContext = this.ControllerContext desem bile. Ayrıca ~ / Views / Gateway / 5.aspx altındaki görünümü arar ve bulamaz.
Simon_Weaver

Ayrıca tüm Eylem Filtrelerini kaybedersiniz. Muhtemelen denetleyicilerinizin uygulaması gereken IController arabiriminde Execute yöntemini kullanmayı denemek istersiniz. Örneğin: ((IController) new HomeController ()). Execute (...). Bu şekilde Action Invoker ardışık düzenine hala katılıyorsunuz. Yürütmek için tam olarak ne vermeniz gerektiğini tam olarak bulmanız gerekir ... Reflektör yardımcı olabilir :)
Andrew Stanton-Hemşire

Evet, bir denetleyiciyi yenileme fikrinden hoşlanmıyorum, bence bunun için uygun genişletme noktası gibi görünen kendi denetleyici fabrikanızı tanımlamanız daha iyi. Ama bu çerçevenin yüzeyini zar zor çizdim, bu yüzden çok uzak olabilirim.
JoshBerke

1

Yönlendirme bu senaryoyu sizin için halletmiyor mu? Örneğin, yukarıda açıklanan senaryo için, bu mantığı uygulayan bir yol işleyicisi oluşturabilirsiniz.


programatik koşullara dayanmaktadır. yani, kampanya 100 7. görünüme gidebilir ve kampanya 200, 8. görünüme gidebilir vb. yönlendirme için çok karmaşık
Simon_Weaver

4
Yönlendirme için bu neden çok karmaşık? Özel rota kısıtlamalarının nesi yanlış? stephenwalther.com/blog/archive/2008/08/07/…
Ian Mercer

1

Yalnızca yukarıdaki TransferResult sınıfını kullanan ifade tabanlı yönlendirmeyi kullanan herkes için, hile yapan ve TempData'yı koruyan bir denetleyici genişletme yöntemi burada verilmiştir. TransferToRouteResult'a gerek yok.

public static ActionResult TransferRequest<T>(this Controller controller, Expression<Action<T>> action)
    where T : Controller
{
     controller.TempData.Keep();
     controller.TempData.Save(controller.ControllerContext, controller.TempDataProvider);
     var url = LinkBuilder.BuildUrlFromExpression(controller.Request.RequestContext, RouteTable.Routes, action);
     return new TransferResult(url);
}

Uyarı: Bu, aslında hala çalışmasına rağmen 'SessionStateTempDataProvider sınıfı, oturum durumunun etkinleştirilmesini gerektiriyor' hatasına neden oluyor gibi görünüyor. Bu hatayı yalnızca günlüklerimde görüyorum. Hata günlüğü için ELMAH kullanıyorum ve InProc ve AppFabric için bu hatayı alıyorum
Simon_Weaver

1

Server.TransferRequestolduğu MVC tamamen gereksiz . Bu, yalnızca ASP.NET'te gerekli olan eski bir özelliktir çünkü istek doğrudan bir sayfaya gelir ve bir isteği başka bir sayfaya aktarmanın bir yolu olması gerekir. ASP.NET'in (MVC dahil) modern sürümleri, doğrudan yönlendirme için özelleştirilebilen bir yönlendirme altyapısına sahiptir istenen kaynağa . İsteğin doğrudan denetleyiciye ve istediğiniz eyleme gitmesini sağlayabildiğinizde, isteğin yalnızca başka bir denetleyiciye aktarılması için bir denetleyiciye ulaşmasına izin vermenin bir anlamı yoktur.

Dahası, orijinal isteğe yanıt verdiğiniz için , herhangi bir şey sıkıştırmanıza gerek yoktur.TempData yalnızca isteği doğru yere yönlendirmek için depolama veya başka bir depolama alanına . Bunun yerine, orijinal istek bozulmadan denetleyici eylemine ulaşırsınız. Tamamen sunucu tarafında gerçekleştiği için Google'ın bu yaklaşımı onaylayacağından da emin olabilirsiniz.

Eğer hem yeraldığını yapmak mümkün olmakla birlikte IRouteConstraintve IRouteHandler, yönlendirme için en güçlü uzatma noktasıdır RouteBasealt sınıf. Bu sınıf, hem gelen yolları hem de giden URL üretimini sağlamak için genişletilebilir, bu da onu URL ve URL'nin yürüttüğü eylem ile ilgili her şey için tek durak noktası yapar.

Bu nedenle, ikinci örneğinizi takip etmek için, bir yerden gitmek /için /home/7, uygun rota değerlerini ekleyen bir rotaya ihtiyacınız vardır.

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Routes directy to `/home/7`
        routes.MapRoute(
            name: "Home7",
            url: "",
            defaults: new { controller = "Home", action = "Index", version = 7 }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Ancak rastgele bir sayfanızın olduğu orijinal örneğinize geri dönersek, bu daha karmaşıktır çünkü rota parametreleri çalışma zamanında değişemez. Yani RouteBaseaşağıdaki gibi bir alt sınıf ile yapılabilir .

public class RandomHomePageRoute : RouteBase
{
    private Random random = new Random();

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData result = null;

        // Only handle the home page route
        if (httpContext.Request.Path == "/")
        {
            result = new RouteData(this, new MvcRouteHandler());

            result.Values["controller"] = "Home";
            result.Values["action"] = "Index";
            result.Values["version"] = random.Next(10) + 1; // Picks a random number from 1 to 10
        }

        // If this isn't the home page route, this should return null
        // which instructs routing to try the next route in the route table.
        return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        var controller = Convert.ToString(values["controller"]);
        var action = Convert.ToString(values["action"]);

        if (controller.Equals("Home", StringComparison.OrdinalIgnoreCase) &&
            action.Equals("Index", StringComparison.OrdinalIgnoreCase))
        {
            // Route to the Home page URL
            return new VirtualPathData(this, "");
        }

        return null;
    }
}

Aşağıdakiler gibi yönlendirmeye kaydedilebilir:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Routes to /home/{version} where version is randomly from 1-10
        routes.Add(new RandomHomePageRoute());

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Yukarıdaki örnekte, kullanıcının geldiği ana sayfa sürümünü kaydeden bir çerez saklamanın da mantıklı olabileceğini unutmayın, böylece geri döndüklerinde aynı ana sayfa sürümünü alırlar.

Ayrıca, bu yaklaşımı kullanarak yönlendirmeyi, sorgu dizisi parametrelerini dikkate alacak (varsayılan olarak bunları tamamen yok sayar) ve buna göre uygun bir denetleyici eylemine yönlendirecek şekilde özelleştirebileceğinizi unutmayın.

Ek Örnekler


Ya bir eyleme girer girmez transfer etmek istemiyorsam, bunun yerine bu eylemin biraz işe yaramasına ve ardından koşullu olarak başka bir eyleme geçmesine izin vermem. Yönlendirmemi doğrudan transfer hedefine gidecek şekilde değiştirmek işe yaramayacak, bu yüzden Server.TransferRequest"MVC'de tamamen gereksiz" görünmüyor.
ProfK

0

Tek başına bir yanıt değil, ancak açıkça gereksinim yalnızca gerçek gezinmenin Webforms Server.Transfer () işlevinin eşdeğer işlevselliğini "yapması" için değil, aynı zamanda tüm bunların birim testinde tam olarak desteklenmesidir.

Bu nedenle, ServerTransferResult bir RedirectToRouteResult gibi "görünmeli" ve sınıf hiyerarşisi açısından olabildiğince benzer olmalıdır.

Bunu Reflector'a bakarak ve RedirectToRouteResult sınıfının ve ayrıca çeşitli Controller temel sınıf yöntemlerinin yaptığı her şeyi yaparak ve ardından genişletme yöntemleriyle Denetleyiciye "ekleyerek" yapmayı düşünüyorum. Belki bunlar indirme kolaylığı / tembelliği için aynı sınıftaki statik yöntemler olabilir mi?

Eğer bunu yapmaya başlarsam, postalarım, yoksa belki başka biri beni yenebilir!


0

Bunu, Html.RenderActionyardımcıyı bir Görünümde kullanarak başardım :

@{
    string action = ViewBag.ActionName;
    string controller = ViewBag.ControllerName;
    object routeValues = ViewBag.RouteValues;
    Html.RenderAction(action, controller, routeValues);
}

Ve denetleyicimde:

public ActionResult MyAction(....)
{
    var routeValues = HttpContext.Request.RequestContext.RouteData.Values;    
    ViewBag.ActionName = "myaction";
    ViewBag.ControllerName = "mycontroller";
    ViewBag.RouteValues = routeValues;    
    return PartialView("_AjaxRedirect");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.