ASP.NET MVC'de başka bir denetleyiciden görünüm görüntüleme


248

Başka bir kumandadan görünüm görüntülemek mümkün müdür?

Diyelim ki CategoriesControllerbir Category/NotFound.aspxgörüşüm var. İken CategoriesController, ben Easly dönebilirsiniz View("NotFound").

Şimdi ProductsControllerbir ürün eklemek için bir eylemim ve görünümüm olduğunu varsayalım. Ancak, bu işlem Ürünü ekleyecek bir Kategorimiz olmasını gerektirir. Örneğin Products/Add/?catid=10,.

Kategoriyi temel alarak bulamazsam , Ürünleri denetleyicisinin altında bir görünüm oluşturmak yerine görünümü Kategoriler denetleyicisinden catidgöstermek istiyorum .NotFoundCategoryNotFound

Bu mümkün mü yoksa işleri yanlış şekilde mi yapılandırıyorum? Bunu yapmanın iyi bir yolu var mı?

Yanıtlar:


283

Evet. Varsayılan olarak, ASP.NET MVC ilk önce denetler \Views\[Controller_Dir]\, ancak bundan sonra görünümü bulamazsa, denetler \Views\Shared.

Paylaşılan dizin, Görünümleri birden çok denetleyicide paylaşmak için özel olarak oradadır. Görünümünüzü Paylaşılan alt dizinine eklemeniz yeterlidir.

Bunu yaparsanız return View("~/Views/Wherever/SomeDir/MyView.aspx"), istediğiniz Görünümü geri verebilirsiniz.


Teşekkürler, kullanmam gereken çözüm gibi geliyor. Yine de başka bir denetleyiciden bir Görünüm görüntülemek mümkün olup olmadığını merak ediyorum. Ben MVC bu bazı kuralı ihlal tahmin?
dtc

1
Yukarıda açıkladığınız durumda, evet, Paylaşılan klasörü kullanıyor olmalısınız.
Jonathan Freeland

69
Evet, bu da mümkün. Görünüm'ü döndürürseniz ("~ / Views / Wherever / SomeDir / MyView.aspx") İstediğiniz Görünümü döndürebilirsiniz. Bu, belirli bir kuralı ihlal etmez, ancak ASP.Net MVC tamamen "yapılandırma üzerinde kongre" ile ilgilidir. Başka bir deyişle, çerçeve belirli kurallar kullanılarak otomatik olarak çalışacak şekilde oluşturulmuştur ve mümkün olan yerlerde kullanmalısınız.
womp

1
Açıklama için teşekkürler. Views'ın bu şekilde çağrılabileceğini bilmiyordum. Paylaşılan dizin elbette mükemmel çalışıyor :)
dtc

1
Kontrolörde değildim, bu yüzden kullanmak zorunda kaldım new ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };ve işe yaradı
Nacht

162

Kullanabilirsiniz:

return View("../Category/NotFound", model);

ASP.NET MVC 3'te test edilmiştir, ancak ASP.NET MVC 2'de de çalışmalıdır.


3
MVC 2'de çalışıyor ve alışılmadık bir durum için en temiz çözüm olduğu ortaya çıktı.
Todd Menier

3
Yeniden paylaşıcı bu bağlantıyı bir hata olarak bildirir, ancak yine de çalışır.
CodeMonkeyKing

1
@CodeMonkeyKing - Yeniden Biçimlendirici 7 (VS2012'de) olarak biçimlendirilmiş bir yolu doğru şekilde tanımlar "~/Views/Category/NotFound.cshtml".
Richard Ev

Dikkat çekmeye değer: Bu çözüm, örneğin "/Category/NotFound.Mobile.cshtml" görünümünüz varsa görüntüleme modlarıyla çalışır.
BenWillkommen

55

Evet mümkün. Bunun RedirectToAction()gibi bir yöntem döndürün:

return RedirectToAction("ActionOrViewName", "ControllerName");

1
Bunun RedirectToAction ("ActionOrView", "Controller", null) olarak gitmesi gerektiğine inanıyorum, aksi takdirde ikinci parametre rotaValues
Zoran P.

Ancak bu durumda, eylemi Görünüm çözümünden farklı olarak denetleyiciye yazmanız gerekir.
tobbenb3

@ tobbenb3 Bir sonucu zor kodlamak yerine bu çok daha iyi bir çözümdür. Her iki durumda da bir yol dizgisini geçmemelisiniz.
perustaja

34

Denedin RedirectToActionmi


1
Paylaşılan klasörlerde görünümü istemeyen herkes için MVC olduğunu söyleyebilirim, diğer tüm çözümler için (doğrudan yolları kullanmak gibi) görünümleri yeniden hesaba katmaya çalışan herkesin aklınızda bulundurması gerekmeyeceğini unutmayın başka bir denetleyicide de kullanıldığını ve bunun öngörülemeyen davranışlarla sonuçlandığını
yoel halb

4
yönlendirmeden nasıl olur?
Luckyy

paylaşılan klasörlere
taşımaktan

Bu çözüm denetleyici üzerinde eylem gerektirir, Görünüm (directPath) herhangi bir işlem yapmadan çıktı oluşturur. Bir eylem eklediğinizde, URL yoluyla doğrudan erişimden gizlemeyi düşünmeniz gerekir, tarayıcı geçmişinde vb.
Jan Zahradník

3
RedirectToAction, tarayıcıya 302 yanıt kodu gönderir. 404 bulunamadı sayfası göstermeye çalıştığınızda bu uygun değildir. Yani, bu çözüm işe yarıyor gibi görünüyor ama arama motorlarını karıştıracak.
NightOwl888

20

Evet yapabilirsin. Bunun gibi bir Eylem döndür:

return RedirectToAction("View", "Name of Controller");

Bir örnek:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

Bu yaklaşım GET yöntemini çağıracaktır.

Ayrıca, değerleri şu şekilde eyleme geçirebilirsiniz:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" });

bu yaklaşımla bir nesneyi nasıl gönderebilirim?
Djeroen

@Djeroen
ignacio chiazzo

5
Bir görünümü döndürmüyorsunuz, bir eylem çağırıyorsunuz.
0014

Her şeyden önce benim için yararlı oldu.
anil shrestha

5

JavaScript / jQuery'den herhangi bir denetleyiciyi de çağırabilirsiniz . Diyelim ki 404 veya başka bir kullanıcı kontrol / sayfa döndüren bir kontrolörünüz var. Daha sonra, bazı eylemlerde, istemci kodunuzdan, denetleyicinizi tetikleyecek ve sonucu HTML biçiminde döndürecek bazı adresleri çağırabilirsiniz , istemci kodunuz bu döndürülen sonucu alabilir ve sayfanızda istediğiniz yere koyabilirsiniz ...


Bunu bilmiyordum. Bu, gelecekte kullanabileceğim bir şey gibi geliyor. Evet, mvc rocks :)
dtc

1

Bu kod ile herhangi bir denetleyici elde edebilirsiniz:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);

Çeviri: Bu kod ile herhangi bir denetleyici elde edebilirsiniz: [kod], Saygılarımızla,
Robert Columbia

3
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Nic3500
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.