C# 通过ViewBag评估web.config文件中的值
任务很简单。我在web.config中有值,如下所示:C# 通过ViewBag评估web.config文件中的值,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,任务很简单。我在web.config中有值,如下所示: <add key="MenuTypes" value="1,2,3"/> <add key="TrucksEnabled" value="true"/> <div> <ul id="setThemUp" class="tabs"> <li><a class="bikes" href="#1">Bike
<add key="MenuTypes" value="1,2,3"/>
<add key="TrucksEnabled" value="true"/>
<div>
<ul id="setThemUp" class="tabs">
<li><a class="bikes" href="#1">Bikes</a></li>
<li><a class="cars" href="#2">Cars</a></li>
@if ((bool)ViewBag.TrucksEnabled)
{
<li><a class="Trucks" href="#3">Trucks</a></li>
}
</ul>
</div>
@if(ViewBag.MenuTypes(((int)3.ToString())>-1)
{
}
我也尝试过:
<div>
<ul id="setThemUp" class="vehicles">
<li><a class="bikes" href="#1">Bikes</a></li>
<li><a class="cars" href="#2">Cars</a></li>
@if (ViewBag.MenuTypes.Contains("3"))
{
<li><a class="Trucks" href="#3">Trucks</a></li>
}
</ul>
</div>
@if(ViewBag.MenuTypes.Contains(“3”))
{
}
但在这两种情况下,我都得到:
用户代码未处理RunTimeBinderException
无法对空引用执行运行时绑定
我让它像这样工作:
<add key="MenuTypes" value="1,2,3"/>
<add key="TrucksEnabled" value="true"/>
<div>
<ul id="setThemUp" class="tabs">
<li><a class="bikes" href="#1">Bikes</a></li>
<li><a class="cars" href="#2">Cars</a></li>
@if ((bool)ViewBag.TrucksEnabled)
{
<li><a class="Trucks" href="#3">Trucks</a></li>
}
</ul>
</div>
@如果((bool)ViewBag.TrucksEnabled)
{
}
但我不能这样使用它。我需要它像第一个例子那样工作。我不太擅长Razor/MVC。非常感谢您的帮助。您有更多的可能性更好地解决此问题,可能是以更可控的方式 您可以创建ActionFilter并修饰主控制器(或需要此属性的其他控制器)以读取应用程序密钥(如
WebConfiguration Manager.AppSettings[“PFUserName”].ToString()
)
这样,您就可以对ViewBag进行更多的控制和行为设置
另一个解决方案是,如果您有一个baseController,您可以设置一个属性来读取此应用程序密钥,尽管只有在您需要在整个应用程序中读取时才可以
OOrrr,如果您只需要在一个操作中使用它,那么最好是简化并在其中设置ViewBag。
var menuTypes = WebConfigurationManager.AppSettings["MenuTypes"].ToString())
string[] tokens = menuTypes.Split(','); //Convert the strings into an array
ViewBag.MenuTypes = tokens;
视图--MenuTypes
现在是一个列表,因此您现在可以使用Contains()
:
@if(ViewBag.MenuTypes.Contains(“3”))
{
}
我个人认为您可能从错误的角度来看待这一点,即查看led逻辑而不是业务逻辑。你希望你的观点对这一切一无所知,真的。我建议创建某种类型的存储,如枚举:
public enum MenuType
{
Cars = 1,
Trucks = 3
}
然后使用如下静态方法:
public static class MenuFunctions
{
public static bool ShowMenu(MenuType menuType)
{
bool showMenu = false;
string appSetting = ConfigurationManager.AppSettings["YourKey"];
if (!String.IsNullOrEmpty(appSetting))
showMenu = appSetting.Contains("/" + (int)menuType.ToString() + "/");
return showMenu;
}
}
您的剃须刀使用情况如下:
@if(MenuFunctions.ShowMenu(MenuType.Trucks)
{
//do truck menu
}
您的应用程序设置如下所示:
<add key = "YourKey" value = "/1/2/3/" />
或者使用您决定的任何分隔符。为了在静态函数中进行更精确的比较,您可以将这些项拆分为一个数组,然后再拆分为一个int,但是您可以理解我的意思
这种方法的好处:
我希望这能有所帮助。各位,所有的例子都很棒,向我展示了很棒的学习材料和选项。在仔细阅读了您提供的示例之后,我找到了另一个我计划使用的解决方案。这非常简单:
<div>
<ul id="setThemUp" class="Vehicles">
<li><a class="bikes" href="#1">Bikes</a></li>
<li><a class="cars" href="#2">Cars</a></li>
@{string options = System.Configuration.ConfigurationManager.AppSettings["MenuTypes"];
if (options.IndexOf("3") > -1)
{
<li><a class="trucks" href="#3">Trucks</a></li>
}
}
</ul>
</div>
@{string options=System.Configuration.ConfigurationManager.AppSettings[“MenuTypes”];
if(选项索引(“3”)>-1)
{
}
}
您对这种方法有何看法?如何设置控制器中的
ViewBag.MenuTypes
?是否可以发布控制器操作?我不会在任何地方设置它。卡车启用之前设置为:`bool trucksEnabled;bool.TryParse(ConfigurationManager.AppSettings[“TruckEnabled”]、out TruckEnabled);ViewBag.TrucksEnabled=TrucksEnabled`这是一个不错的建议,但我认为ActionFilter在这里可能会有些过分。不管怎样,在配置键上使用ViewBag是一个灾难的秘诀,我总是喜欢在人类可能的情况下使用定义而不是动力学。你是对的,动力学在我看来是要避免的,但另一方面,它很优秀,但它就像原力的黑暗面,必须非常小心地使用。所以如果你不知道该怎么做,最好避免。我个人认为它很脆弱。1.如果密钥丢失或为空,视图将自行内爆。2.您正在将逻辑嵌入到视图中,这与模式背道而驰。3.如果钥匙中的ID为13、23或33等,则逻辑中断。对不起,我太苛刻了。