RedirectToAction พร้อมพารามิเตอร์


596

ฉันมีผมเรียกการกระทำจากสมอ thusly, Site/Controller/Action/IDที่เป็นIDint

หลังจากนั้นฉันต้องเปลี่ยนเส้นทางไปยังการกระทำเดียวกันนี้จากคอนโทรลเลอร์

มีวิธีที่ฉลาดในการทำสิ่งนี้หรือไม่? ขณะนี้ฉันกำลังIDอยู่ใน tempdata แต่เมื่อคุณกด f5 เพื่อรีเฟรชหน้าอีกครั้งหลังจากกลับไป tempdata จะหายไปและหน้าเว็บล้มเหลว

คำตอบ:


946

คุณสามารถส่งรหัสเป็นส่วนหนึ่งของพารามิเตอร์ routeValues ​​ของวิธีการ RedirectToAction ()

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

สิ่งนี้จะทำให้เกิดการเปลี่ยนเส้นทางไปยังไซต์ / คอนโทรลเลอร์ / การกระทำ / 99 ไม่จำเป็นต้องใช้ temp หรือข้อมูลมุมมองใด ๆ


2
อย่างไรก็ตามมีการทำเช่นนั้นหรือสิ่งที่คล้ายกัน แต่ยังระบุตัวควบคุมหรือไม่ (ฉันต้องทำสิ่งนั้นจากคอนโทรลเลอร์หนึ่งอันไปจนถึงแอ็คชั่นของคอนโทรลเลอร์อื่น)
Diego

18
@Diego: ใช่มีสองเกินพิกัดที่ ในตัวอย่างของฉันมันจะเป็น RedirectToAction ("Action", "Controller", ใหม่ {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler

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

มีวิธีการทำสิ่งเดียวกัน แต่ไม่มีการปรับปรุง URL เช่นนั้นหรือไม่
คุ้มค่า 7

@KurtSchindler ยังไงก็ตามเพื่ออัพเดตคำตอบของคุณเพื่อรวมตัวอย่างความคิดเห็นของคุณเกี่ยวกับการเปลี่ยนเส้นทางไปยังตัวควบคุมที่แตกต่างเช่นกัน? เพื่อช่วยเหลือผู้ที่อาจข้ามการอ่านความคิดเห็น
Edward

194

คำตอบของ Kurtควรจะถูกต้องจากการวิจัยของฉัน แต่เมื่อฉันลองมันฉันต้องทำสิ่งนี้เพื่อให้มันใช้งานได้จริงสำหรับฉัน:

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

หากฉันไม่ได้ระบุตัวควบคุมและการกระทำในRouteValueDictionaryนั้นไม่ได้ทำงาน

นอกจากนี้เมื่อโค้ดเช่นนี้พารามิเตอร์แรก (Action) ดูเหมือนว่าจะถูกละเว้น ดังนั้นหากคุณเพิ่งระบุคอนโทรลเลอร์ใน Dict และคาดว่าพารามิเตอร์แรกจะระบุ Action มันจะไม่ทำงานเช่นกัน

หากคุณจะมาในภายหลังลองคำตอบของ Kurt ก่อนและหากคุณยังมีปัญหาลองทำสิ่งนี้


6
คำตอบที่ดี นอกจากนี้ฉันเชื่อว่าcontrollerพารามิเตอร์เป็นตัวเลือกหากการดำเนินการเปลี่ยนเส้นทางอยู่ในตัวควบคุมเดียวกันกับการดำเนินการที่คุณเปลี่ยนเส้นทาง
im1dermike

1
มันควรจะเป็น แต่เมื่อฉันทำอย่างนั้นมันไม่ทำงานฉันต้องเพิ่มตัวควบคุมอย่างชัดเจน ... นั่นเป็นตัวอักษรในวันแรกของ MVC ถ้าฉันต้องเดาตอนนี้ฉันจะบอกว่าฉัน มีปัญหาการตั้งค่าการกำหนดเส้นทางบางประเภทให้ตรวจสอบ
Eric Brown - Cal

แปลก. ใช้งานได้สำหรับฉันใน MVC4
im1dermike

สิ่งนี้เกิดขึ้นในอีก MVC1 วันและมันใช้ได้ผลดีกับคนอื่น ๆ นั่นเป็นสาเหตุที่ฉันสงสัยว่ามีปัญหาเกี่ยวกับการกำหนดค่ามองย้อนกลับไป
Eric Brown - Cal

@ EricBrown-Cal แม้จะมีความคิดเห็นของคุณเองในความคิดเห็นของคุณคุณไม่คิดว่าคำตอบของ Kurt นั้นเหมาะสำหรับผู้ที่ต้องการคำตอบในประเด็นเดียวกับที่คุณมีในวันเริ่มต้นใช่ไหม?
Edward

62

RedirectToAction ด้วยพารามิเตอร์:

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

1
ใช้งานได้หรือไม่ ฉันเชื่อว่านี่เป็นไวยากรณ์ที่ไม่ถูกต้อง ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
Mohammed Zameer

1
@ pb2q new {id = id}ทำงานได้ดีเช่นกันเนื่องจากกรอบงานรู้ว่าตัวแปรใดที่คุณอ้างถึง
Edward

61

นอกจากนี้ยังเป็นที่น่าสังเกตว่าคุณสามารถผ่านพารามิเตอร์มากกว่า 1 รายการ id จะถูกใช้เพื่อสร้างส่วนของ URL และอื่น ๆ จะถูกส่งผ่านเป็นพารามิเตอร์หลังจาก? ใน url และจะเป็น UrlEncoded เป็นค่าเริ่มต้น

เช่น

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

ดังนั้น URL จะเป็น:

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

สิ่งเหล่านี้สามารถอ้างอิงได้โดยคอนโทรลเลอร์ของคุณ:

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

43
//How to use RedirectToAction in MVC

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

ตัวอย่าง

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

39

ตัวอย่าง MVC 4 ...

โปรดทราบว่าคุณไม่จำเป็นต้องส่งพารามิเตอร์ชื่อ ID เสมอไป

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

และ,

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

แน่นอนคุณสามารถกำหนดสตริงให้กับฟิลด์โมเดลแทนการใช้ ViewBag หากคุณชอบ


24

ถ้าพารามิเตอร์ของคุณเกิดขึ้นจะเป็นวัตถุที่ซับซ้อนนี้จะช่วยแก้ปัญหาที่เกิดขึ้น ที่สำคัญคือตัวRouteValueDictionaryสร้าง

return RedirectToAction("Action", new RouteValueDictionary(Model))

หากคุณเกิดขึ้นจะมีคอลเลกชันก็จะทำให้มันยุ่งยากเล็กน้อยแต่คำตอบอื่น ๆ นี้ครอบคลุมถึงนี้อย่างมาก


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

ทำงานให้ฉันไม่จำเป็นต้องทำ new{id = id}

ฉันเปลี่ยนเส้นทางไปยังภายในคอนโทรลเลอร์เดียวกันดังนั้นฉันจึงไม่ต้องการ"Controller"แต่ฉันไม่แน่ใจเกี่ยวกับตรรกะเฉพาะด้านหลังเมื่อจำเป็นต้องใช้คอนโทรลเลอร์เป็นพารามิเตอร์


RedirectToAction("Action", "Controller", new { id = id});เป็นสิ่งที่ฉันต้องการในแอป Core 3.1 ของฉัน
orangecaterpillar

18

หากต้องการแสดงข้อความแสดงข้อผิดพลาด[httppost]เขา / เธอสามารถลองผ่าน ID โดยใช้

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

สำหรับรายละเอียดเช่นนี้

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

หวังว่ามันจะทำงานได้ดี



15

ฉันมีปัญหานี้เช่นกันและค่อนข้างเป็นวิธีที่ดีที่จะทำถ้าคุณอยู่ในตัวควบคุมเดียวกันคือการใช้พารามิเตอร์ชื่อ:

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

7

นี่อาจเป็นปีที่ผ่านมา แต่อย่างไรก็ตามยังขึ้นอยู่กับเส้นทางแผนที่ Global.asax ของคุณเนื่องจากคุณอาจเพิ่มหรือแก้ไขพารามิเตอร์เพื่อให้เหมาะกับสิ่งที่คุณต้องการ

เช่น.

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

จากนั้นพารามิเตอร์ที่คุณต้องผ่านจะเปลี่ยนเป็น:

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

7

หากคุณต้องการเปลี่ยนเส้นทางไปยังการกระทำนอกตัวควบคุมจะทำงาน

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

1

รายการต่อไปนี้สำเร็จด้วย asp.net core 2.1 มันอาจใช้ที่อื่น พจนานุกรม ControllerBase.ControllerContext.RouteData.Values ​​เข้าถึงได้โดยตรงและเขียนได้จากภายในวิธีการดำเนินการ บางทีนี่อาจเป็นปลายทางสุดท้ายของข้อมูลในโซลูชันอื่น ๆ นอกจากนี้ยังแสดงว่าข้อมูลเส้นทางเริ่มต้นมาจากที่ใด

[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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.