代码之家  ›  专栏  ›  技术社区  ›  Antony Scott

在asp.net mvc2中有条件地呈现部分视图的更简洁的方法

  •  1
  • Antony Scott  · 技术社区  · 14 年前

    基于通过ViewDataDictionary传入的参数,我有一个内联样式要应用于局部视图。

    我的ascx看起来像这样-

    <div <% if ((bool)ViewData["Visible"] == false) { %> style="display:none;" <% } %>>
      ...
    </div>
    


    只是澄清一下,这是一个已经在使用强类型模型的局部视图。因此,我需要一种方法将额外的信息传递给部分视图,而这在模型中是不可能的,因为它实际上是为包含视图的模型中集合容器的每个条目调用的。

    4 回复  |  直到 14 年前
        1
  •  1
  •   djdd87    14 年前

    可以将其包含在条件运算符中:

    <div <%= !(bool)ViewData["Visible"] ? "style='display:none;'" : "" %>>
      ...
    </div>
    

    <div id="foo" <%= "a" == "b" ? 
        "style='display:none;'" : "" %> />
    

    这将正确设置样式:

    <div id="foo" <%= "a" == "a" ? 
        "style='display:none;'" : "" %> />
    
        2
  •  1
  •   Ahmad    14 年前

    所有给出的答案都可以,但是我更喜欢将任何“if”逻辑包装在helper中

    public static string DisplayDivStyle(this Htmlhelper helper, bool visible)
    {
      return visible ? String.Empty: "style=\"display:none\"" ; 
    }
    

    然后像这样使用。。

    <div <%= Html.DisplayDivStyle((bool)ViewData["Visible"])%>>
    

        3
  •  0
  •   uriDium    14 年前

    您可以为模型中标志所在的视图创建自定义模型。

    所以你可以做一个简单明了的

    <% if (Model.Visible) { %>
    <div id='foo'></div>
    <% } %>
    

    以及包装原始模型的自定义类:

    public class MyCustomModel 
    {
      private Original model {get; set;}
      private bool visible {get; set;}
    
      public class MyCustomModel(Original model)
      {
        this.model = model;
      }
    }
    

    然后在控制器中创建包装器,并像平常一样将其传递给视图。

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MVCApp.ViewModels.YourCustomModel>" %>
    

    请原谅我的语法,它可能不是100%。不过你还是明白了。

        4
  •  0
  •   mallows98    14 年前

    您可以做的另一种选择是创建一个模型并将其传递给分部类。例如:

    视图模型类:

    using System;
    using System.Web;
    ...
    namespace Sample {
    public class MyViewModel
        {
           public bool Visible { get; set; }
           public string DivInline { get { return !Visible ? "style=\"display:none\"" : String.Empty; } }
        }
    }
    

    在控制器中:

    public ActionResult ShowPage()
    {
         var myViewModel = new myViewModel();
         myViewModel.Visible = true;
         return View(myViewModel);
    }
    

    在你看来:

    <%@Page .... Inherits="System.Web.Mvc.ViewPage<SampleNS.MyViewModel>"%>
    ...
    <div <%= Model.DivInline %>>
    ...
    </div>
    

    请注意,这是没有测试,但你得到的理论:)

    希望这有帮助!