Parametreli RedirectToAction


596

Bu şekilde bir çapadan çağırdığım bir eylemim var, Site/Controller/Action/IDnerede IDbir int.

Daha sonra bir Denetleyiciden aynı Eylem'e yönlendirmem gerekiyor.

Bunu yapmanın akıllıca bir yolu var mı? Şu anda tempdata'da IDsaklıyorum, ancak geri döndükten sonra sayfayı yenilemek için f5 tuşuna bastığınızda, tempdata gitti ve sayfa çöküyor.

Yanıtlar:


946

Kimliği, RedirectToAction () yönteminin routeValues ​​parametresinin bir parçası olarak iletebilirsiniz.

return RedirectToAction("Action", new { id = 99 });

Bu, Site / Denetleyici / İşlem / 99'a yönlendirmeye neden olur. Geçici veya herhangi bir görüntüleme verisine gerek yoktur.


2
Bunu ya da buna benzer bir şey yapmanın yanı sıra denetleyiciyi belirtmenin bir yolu var mı? (Bunu bir denetleyiciden diğer denetleyicinin eylemine kadar yapmam gerekir).
Diego

18
@Diego: evet, bunun için birkaç aşırı yükleme var. Örneğimde bu RedirectToAction ("Eylem", "Denetleyici", yeni {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler

10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Jeremy

Aynı şeyi yapmanın bir yolu var ama url güncellemesi böyle değil mi?
Worthy7

@KurtSchindler Yine de cevabınızı farklı denetleyiciye yönlendirmeye yönelik yorum örneğinizi içerecek şekilde güncellemek için? Yorumları okumayı atlayabilenlere yardım etmek.
Edward

194

Kurt'un cevabı araştırmamdan doğru olmalı, ama denediğimde gerçekten benim için çalışmasını sağlamak için bunu yapmak zorundaydım:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id } ) );

Denetleyiciyi belirtmediysem ve içindeki eylem RouteValueDictionaryişe yaramadı.

Ayrıca bu şekilde kodlandığında, ilk parametre (Eylem) yok sayılıyor gibi görünüyor. Dolayısıyla, sadece Dict'taki denetleyiciyi belirtirseniz ve ilk parametrenin Eylem'i belirtmesini beklerseniz, bu da çalışmaz.

Daha sonra geliyorsanız, önce Kurt'un cevabını deneyin ve hala sorunlarınız varsa bunu deneyin.


6
Mükemmel cevap. Ayrıca, controlleryönlendirme eylemi, yönlendirdiğiniz işlemle aynı denetleyicide ise parametrenin isteğe bağlı olduğuna inanıyorum .
im1dermike

1
olması gerekiyordu, ama bu şekilde yaptığımda işe yaramadı, denetleyiciyi açık bir şekilde eklemeliydim ... tam anlamıyla MVC'nin ilk günlerinde oldu, tahmin etmeliydim şimdi söyleyeyim bir tür yönlendirme kurulum sorunu vardı.
Eric Brown - Cal

Tuhaf. MVC4'te benim için çalışıyor.
im1dermike

Bu MVC1 günlerinde tekrar oldu ve diğerleri için iyi çalıştı, bu yüzden geriye baktığımda bir yapılandırma sorunundan şüpheleniyorum.
Eric Brown -

@ EricBrown-Cal Yorumlarınızda bile sizin kendi sunumunuz göz önüne alındığında, Kurt'un cevabının başlangıç ​​günlerinizde yaşadığınız soruna cevap vermek isteyenler için daha uygun olduğunu düşünmüyor musunuz?
Edward

62

RedirectToAction parametresi ile:

return RedirectToAction("Action","controller", new {@id=id});

1
Çalışıyor mu? Bunun yanlış sözdizimi olduğuna inanıyorum. Yanlışsam düzelt.
Mohammed Zameer

1
@ pb2q new {id = id}de aynı şekilde çalışır çünkü çerçeve hangi değişkenden bahsettiğinizi bilir.
Edward

61

Ayrıca 1'den fazla parametreden geçebileceğinizi de belirtmek gerekir. URL'nin bir parçasını oluşturmak için id kullanılır ve diğerleri a? URL olarak değiştirilir ve varsayılan olarak UrlEncoded olur.

Örneğin

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });

URL şu şekilde olur:

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff

Daha sonra bunlara denetleyiciniz tarafından başvurulabilir:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }

43
//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);

misal

return RedirectToAction("Index", "Home", new { id = 2});

39

MVC 4 örneği ...

Her zaman ID adlı parametreyi iletmeniz gerekmediğini unutmayın

var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });

Ve,

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 

Elbette, tercihinizse ViewBag kullanmak yerine model alanlarına dize atayabilirsiniz.



21
RedirectToAction("Action", "Controller" ,new { id });

Benim için çalıştı, gerek yoktu new{id = id}

Aynı denetleyiciye yeniden yönlendiriyordum, bu yüzden ihtiyacım yoktu "Controller"ama denetleyici parametre olarak gerektiğinde arkasındaki belirli mantıktan emin değilim.


RedirectToAction("Action", "Controller", new { id = id});Core 3.1 uygulamamda ihtiyacım olan tek şeydi.
orangecaterpillar

18

Birisi için hata mesajını göstermek istiyorsa, [httppost]kullanarak bir kimlik ileterek deneyebilir

return RedirectToAction("LogIn", "Security", new { @errorId = 1 });

bunun gibi ayrıntılar için

 public ActionResult LogIn(int? errorId)
        {
            if (errorId > 0)
            {
                ViewBag.Error = "UserName Or Password Invalid !";
            }
            return View();
        }

[Httppost]
public ActionResult LogIn(FormCollection form)
        {
            string user= form["UserId"];
            string password = form["Password"];
            if (user == "admin" && password == "123")
            {
               return RedirectToAction("Index", "Admin");
            }
            else
            {
                return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
            }
}

Umarım iyi çalışır.


16

....

int parameter = Convert.ToInt32(Session["Id"].ToString());

....

return RedirectToAction("ActionName", new { Id = parameter });

15

Ben de bu sorunu vardı ve aynı denetleyicide iseniz bunu yapmak için oldukça güzel bir yol adlandırılmış parametreleri kullanmaktır:

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });

7

Bu yıllar önce olabilir, ancak yine de bu, Global.asax harita rotanıza da bağlıdır, çünkü istediğiniz şekilde parametreler ekleyebilir veya düzenleyebilirsiniz.

Örneğin.

Global.asax

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

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            //new { controller = "Home", action = "Index", id = UrlParameter.Optional 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional,
                  extraParam = UrlParameter.Optional // extra parameter you might need
        });
    }

geçmeniz gereken parametreler şu şekilde değişir:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );

7

Denetleyici dışındaki bir eyleme yeniden yönlendirmeniz gerekirse bu işe yarayacaktır.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });

1

Aşağıdaki asp.net çekirdek 2.1 ile başarılı oldu. Başka bir yerde geçerli olabilir. ControllerBase.ControllerContext.RouteData.Values ​​sözlüğüne doğrudan eylem yönteminden erişilebilir ve yazılabilir. Belki de bu, diğer çözümlerde verinin nihai varış noktasıdır. Ayrıca, varsayılan yönlendirme verilerinin nereden geldiğini de gösterir.

[Route("/to/{email?}")]
public IActionResult ToAction(string email)
{
    return View("To", email);
}
[Route("/from")]
public IActionResult FromAction()
{
    ControllerContext.RouteData.Values.Add("email", "mike@myemail.com");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/mike@myemail.com
}
[Route("/FromAnother/{email?}")]`
public IActionResult FromAnotherAction(string email)
{
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/<whatever the email param says>
         // no need to specify the route part explicitly
}
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.