Görünümde veya denetleyicide geçerli alan adını nasıl alırsınız?
ViewContext.RouteData.Values["controller"]
Alanlar gibi bir şey var mı ?
Görünümde veya denetleyicide geçerli alan adını nasıl alırsınız?
ViewContext.RouteData.Values["controller"]
Alanlar gibi bir şey var mı ?
Yanıtlar:
MVC2'den itibaren kullanabilirsiniz ViewContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0
yerine çağrıldı MVC6
.. :-)
Şunları kullanarak denetleyiciden edinebilirsiniz:
ControllerContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0'da değer şurada bulunur:
ViewContext.RouteData.Values [ "alan"];
pageModel.RouteData.Values.TryGetValue("area", out object area)
onun yerine kullanılmalı)
Bununla ilgili bir günlük girişi yazdım , daha fazla ayrıntı için bunu ziyaret edebilirsiniz, ancak cevabım aşağıda gösterilen bir Uzantı Yöntemi oluşturmaktı.
Ana tetikleyici, MVC Alanını .DataTokens öğesinden ve denetleyiciyi / eylemi .Values of the RouteData.
public static MvcHtmlString TopMenuLink(this HtmlHelper htmlHelper, string linkText, string controller, string action, string area, string anchorTitle)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action(action, controller, new { @area = area });
var anchor = new TagBuilder("a");
anchor.InnerHtml = HttpUtility.HtmlEncode(linkText);
anchor.MergeAttribute("href", url);
anchor.Attributes.Add("title", anchorTitle);
var listItem = new TagBuilder("li");
listItem.InnerHtml = anchor.ToString(TagRenderMode.Normal);
if (CheckForActiveItem(htmlHelper, controller, action, area))
listItem.GenerateId("menu_active");
return MvcHtmlString.Create(listItem.ToString(TagRenderMode.Normal));
}
private static bool CheckForActiveItem(HtmlHelper htmlHelper, string controller, string action, string area)
{
if (!CheckIfTokenMatches(htmlHelper, area, "area"))
return false;
if (!CheckIfValueMatches(htmlHelper, controller, "controller"))
return false;
return CheckIfValueMatches(htmlHelper, action, "action");
}
private static bool CheckIfValueMatches(HtmlHelper htmlHelper, string item, string dataToken)
{
var routeData = (string)htmlHelper.ViewContext.RouteData.Values[dataToken];
if (routeData == null) return string.IsNullOrEmpty(item);
return routeData == item;
}
private static bool CheckIfTokenMatches(HtmlHelper htmlHelper, string item, string dataToken)
{
var routeData = (string)htmlHelper.ViewContext.RouteData.DataTokens[dataToken];
if (dataToken == "action" && item == "Index" && string.IsNullOrEmpty(routeData))
return true;
if (dataToken == "controller" && item == "Home" && string.IsNullOrEmpty(routeData))
return true;
if (routeData == null) return string.IsNullOrEmpty(item);
return routeData == item;
}
Daha sonra aşağıdaki gibi uygulayabilirsiniz:
<ul id="menu">
@Html.TopMenuLink("Dashboard", "Home", "Index", "", "Click here for the dashboard.")
@Html.TopMenuLink("Courses", "Home", "Index", "Courses", "List of our Courses.")
</ul>
area
jetonu içinde bulamıyorum Values
ama bakmam gerekiyor DataTokens
... nedenini bilmiyorum.
RouteData
Mevcut alan adını döndüren bir uzantı yöntemi oluşturdum .
public static string GetAreaName(this RouteData routeData)
{
object area;
if (routeData.DataTokens.TryGetValue("area", out area))
{
return area as string;
}
return null;
}
Çünkü RouteData
her ikisinde de mevcuttur ControllerContext
ve oyun ViewContext
kumandanızdan ve görünümlerinizden erişilebilir.
Ayrıca test etmek çok kolaydır:
[TestFixture]
public class RouteDataExtensionsTests
{
[Test]
public void GetAreaName_should_return_area_name()
{
var routeData = new RouteData();
routeData.DataTokens.Add("area", "Admin");
routeData.GetAreaName().ShouldEqual("Admin");
}
[Test]
public void GetAreaName_should_return_null_when_not_set()
{
var routeData = new RouteData();
routeData.GetAreaName().ShouldBeNull();
}
}
RouteData.DataTokens
Bu her zaman dahili olarak başlatıldığı için boş olup olmadığını kontrol etmeye gerek yoktur .
MVC Futures , AreaHelpers.GetAreaName () yöntemine sahiptir. Ancak, bu yöntemi kullanıyorsanız dikkatli olun. Uygulamanız hakkında çalışma zamanı kararları vermek için mevcut alanı kullanmak, hata ayıklaması zor veya güvenli olmayan koda yol açabilir.
this.GetName()
ve mevcut Yöntem kullanımı içinMethodBase.GetCurrentMethod().Name
Bunun eski olduğunu biliyorum, ancak ActionFilter gibi bir filtrede olduğunda, bağlam size alan bilgilerini kolayca sağlamaz.
Aşağıdaki kodda bulunabilir:
var routeData = filterContext.RequestContext.RouteData;
if (routeData.DataTokens["area"] != null)
area = routeData.DataTokens["area"].ToString();
Bu nedenle, filtreContext geçersiz kılma sırasında iletilir ve doğru RouteData, RequestContext altında bulunur. Temel düzeyde bir RoutData vardır, ancak DataToken'ların sözlüğünde alan YOKTUR.
Bunun çok eski bir gönderi olduğunu biliyorum, ancak Values Property'ni DataTokens ile tamamen aynı şekilde kullanabiliriz
Url.RequestContext.RouteData.Values ["eylem"] benim için çalıştı.
Neden bilmiyorum ama kabul edilen cevap işe yaramıyor. Örneğin null döndürür (belki mvc hakkında, .net çekirdeğini kullanıyorum)
Her zaman değişkenin hatalarını gideririm ve içindeki verileri alırım.
Bunu dene. Benim için çalışıyor
var area = ViewContext.RouteData.Values["area"]
Ayrıntılı mantıksal örnek
Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";