RedirectToAction dengan parameter

597

Saya punya tindakan yang saya sebut dari jangkar dengan demikian, di Site/Controller/Action/IDmana IDada int.

Kemudian saya perlu mengalihkan ke Aksi yang sama dari Controller.

Apakah ada cara cerdas untuk melakukan ini? Saat ini saya menyembunyikan IDdi tempdata, tetapi ketika Anda menekan f5 untuk menyegarkan kembali halaman setelah kembali, tempdata hilang dan halaman macet.

Eric Brown - Cal
sumber

Jawaban:

947

Anda dapat melewatkan id sebagai bagian dari parameter routeValues ​​dari metode RedirectToAction ().

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

Ini akan menyebabkan pengalihan ke Situs / Pengendali / Tindakan / 99. Tidak perlu temp atau jenis data tampilan apa pun.

Kurt Schindler
sumber
2
Apakah ada pula yang melakukan itu atau sesuatu yang serupa tetapi juga menentukan controller? (Saya perlu melakukan itu dari satu pengontrol ke aksi pengontrol lain).
Diego
18
@Diego: ya, ada beberapa kelebihan untuk itu. Dalam contoh saya itu akan menjadi RedirectToAction ("Action", "Controller", new {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
Apakah ada cara untuk melakukan hal yang sama tetapi tidak memiliki pembaruan url seperti itu?
Layak
@KurtSchindler Lagi pula untuk memperbarui jawaban Anda untuk menyertakan contoh komentar Anda tentang pengalihan ke pengontrol yang berbeda juga? Untuk membantu mereka yang mungkin melewatkan membaca komentar.
Edward
194

Jawaban Kurt seharusnya benar, dari penelitian saya, tetapi ketika saya mencobanya saya harus melakukan ini agar benar-benar bekerja untuk saya:

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

Jika saya tidak menentukan controller dan tindakan di RouteValueDictionarydalamnya tidak berfungsi.

Juga ketika dikodekan seperti ini, parameter pertama (Aksi) tampaknya diabaikan. Jadi, jika Anda hanya menentukan controller di Dict, dan mengharapkan parameter pertama untuk menentukan Action, itu tidak berfungsi baik.

Jika Anda datang nanti, coba jawaban Kurt terlebih dahulu, dan jika Anda masih memiliki masalah coba yang ini.

Eric Brown - Cal
sumber
6
Jawaban yang bagus Juga, saya yakin controllerparameternya opsional jika aksi redirect ada di controller yang sama dengan action yang Anda redirect.
im1dermike
1
seharusnya, tetapi ketika saya melakukannya dengan cara itu, itu tidak berhasil, saya harus secara eksplisit menambahkan controller ... yang secara harfiah di hari-hari pertama saya di MVC, jika saya harus menebak sekarang saya akan mengatakan saya punya beberapa jenis masalah pengaturan perutean untuk dilihat.
Eric Brown - Cal
Aneh. Bekerja untuk saya di MVC4.
im1dermike
Ini terjadi kembali di MVC1 hari, dan itu bekerja dengan baik untuk orang lain, itu sebabnya saya curiga ada masalah konfigurasi, melihat ke belakang.
Eric Brown - Cal
@ EricBrown-Cal Diberikan bahkan kiriman Anda sendiri dalam komentar Anda, bukankah menurut Anda jawaban Kurt lebih cocok untuk mereka yang mencari jawaban untuk masalah yang sama dengan yang Anda miliki di hari-hari awal Anda?
Edward
62

RedirectToAction dengan parameter:

return RedirectToAction("Action","controller", new {@id=id});
kavitha Reddy
sumber
1
Apakah itu bekerja? Saya percaya ini adalah sintaks yang salah. Koreksi saya jika saya salah.
Mohammed Zameer
1
@ pb2q new {id = id}berfungsi dengan baik karena framework tahu variabel mana yang Anda maksud.
Edward
61

Perlu dicatat bahwa Anda dapat melewati lebih dari 1 parameter. id akan digunakan untuk membuat bagian dari URL dan yang lainnya akan dilewati sebagai parameter setelah? di url dan akan UrlEnkode sebagai default.

misalnya

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

Jadi urlnya adalah:

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

Ini kemudian dapat dirujuk oleh controller Anda:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }
CF5
sumber
43
//How to use RedirectToAction in MVC

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

contoh

return RedirectToAction("Index", "Home", new { id = 2});
Thivan Mydeen
sumber
39

Contoh MVC 4 ...

Perhatikan bahwa Anda tidak selalu harus melewati parameter bernama ID

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

Dan,

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

Tentu saja Anda dapat menetapkan string ke bidang model alih-alih menggunakan ViewBag jika itu pilihan Anda.

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

Bekerja untuk saya, tidak perlu dilakukan new{id = id}

Saya mengarahkan ke dalam pengontrol yang sama jadi saya tidak perlu "Controller"tetapi saya tidak yakin pada logika spesifik di belakang ketika pengontrol diperlukan sebagai parameter.

Zaeem Q
sumber
RedirectToAction("Action", "Controller", new { id = id});hanya apa yang saya butuhkan di aplikasi Core 3.1 saya.
orangecaterpillar
18

Jika seseorang ingin Tampilkan pesan kesalahan untuk [httppost]kemudian ia dapat mencoba dengan melewati ID menggunakan

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

untuk Detail seperti ini

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

Semoga berhasil.

Toriq Sagor
sumber
16

....

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

....

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

Saya punya masalah ini juga, dan cara yang cukup baik untuk melakukannya jika Anda berada di dalam pengontrol yang sama adalah dengan menggunakan parameter bernama:

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

Ini mungkin bertahun-tahun yang lalu tetapi bagaimanapun juga, ini juga tergantung pada rute peta Global.asax Anda karena Anda dapat menambah atau mengedit parameter agar sesuai dengan yang Anda inginkan.

misalnya.

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

maka parameter yang harus Anda lewati akan berubah menjadi:

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

Jika Anda perlu mengarahkan ulang ke tindakan di luar controller ini akan berfungsi.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
chr.solr
sumber
1

Berikut ini berhasil dengan asp.net core 2.1. Ini mungkin berlaku di tempat lain. Kamus ControllerBase.ControllerContext.RouteData.Values ​​dapat diakses secara langsung dan dapat ditulis dari dalam metode tindakan. Mungkin ini adalah tujuan akhir data dalam solusi lain. Ini juga menunjukkan dari mana data routing default berasal.

[Route("/to/{email?}")]
public IActionResult ToAction(string email)
{
    return View("To", email);
}
[Route("/from")]
public IActionResult FromAction()
{
    ControllerContext.RouteData.Values.Add("email", "[email protected]");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/[email protected]
}
[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
}
mikemay
sumber