Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过ViewBag评估web.config文件中的值_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 通过ViewBag评估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

任务很简单。我在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">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,但是您可以理解我的意思

    这种方法的好处:

  • 你的观点不懂逻辑
  • 如果您将它包装在一个try块中,并且您可以在适当的地方捕获并记录异常,而不是让视图爆炸,那么它将在服务器端正常地失败
  • 您在设计时使用枚举处理集合类型。拿出一个菜单,您将在构建时知道哪里出了问题,而不是在运行时QA或更糟的情况下
  • 更易于维护,因为您不使用可能存在或不存在的配置之上的分层动态

  • 我希望这能有所帮助。

    各位,所有的例子都很棒,向我展示了很棒的学习材料和选项。在仔细阅读了您提供的示例之后,我找到了另一个我计划使用的解决方案。这非常简单:

    <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等,则逻辑中断。对不起,我太苛刻了。