【问题标题】:How to make hidden fields for model automatically?如何自动为模型制作隐藏字段?
【发布时间】:2012-07-03 18:49:08
【问题描述】:

我正在寻找在视图中自动创建隐藏字段的方法。 这是我的模型:

public class MyViewModel()
{
    public int Id{get;set;}
    [Required]
    public string Name {get;set;
    public ComlexType MyComplexType{get;set;}
    ...
}

鉴于我必须枚举所有模型字段:

@Html.HiddenFor(m=>m.Id);
@Html.HiddenFor(m=>m.MyComplexType.Title);

...

【问题讨论】:

  • 你可以尝试在你的css中添加一个隐藏的类。并在 javascript 中删除和添加此类。还是我错误地解释了你的问题?
  • 错了我在问一种使用 html 助手枚举所有字段的方法。这里应该有反射和递归的东西..
  • @Yara,一旦你知道它是带有反射和递归的东西,你到目前为止付出了什么努力?

标签: c# asp.net-mvc-3 hidden-field


【解决方案1】:

如果您有许多类型需要这样做,帮助器和反射可能是最好的。

如果你有少量这些,创建一个部分可能更容易添加你想要的隐藏内容

@{Html.RenderPartial("HiddenComplexType", Model );}

您需要传递模型,而不是 ComplexType 成员。您可能需要一个接口或基类,部分可以用作模型

interface IHasComplexType
{
    ComplexType  GetComplexType();
}

public class MyViewModel : IHasComplexModel
{
    public ComplexType GetComplexType() { return MyComplexType;}
}

还有其他方法可以做到这一点,但您需要进行反思,帮助者可能同样简单。

【讨论】:

    【解决方案2】:

    在您看来,您可以使用:

    @Html.EditorForModel()
    

    在您的模型中,您可以添加 HiddenInput 属性:

    public class MyViewModel()
    {
        [HiddenInput(DisplayValue = false)]
        public int Id{get;set;}
        [Required]
        public string Name {get;set;
        public ComlexType MyComplexType{get;set;}
        ...
    }
    

    【讨论】:

      【解决方案3】:

      我已经完成了下一个解决方案: 'ReflectionHelper' 类反映模型属性,并且在 'properties' 变量中是模型字段 {{'Id',1},{'Name','Myname'} 等}:

      public static class ReflectionHelper
      {
          public static void IterateProps(Object obj, string baseProperty, ref Dictionary<string,object> properties )
          {
              if (obj != null)
              {
                  var baseType = obj.GetType();
                  var props = baseType.GetProperties();
                  foreach (var property in props)
                  {
                      var name = property.Name;
                      var propType = property.PropertyType;
                      if (propType.IsClass && propType.Name != "String")
                      {
                          IterateProps(property.GetValue(obj, null), baseProperty + "." + property.Name, ref properties);
                      }
                      else
                      {
                          properties.Add(baseProperty + "." + name, property.GetValue(obj, null));
                      }
                  }
              }
          }
      }
      

      鉴于我会做下一个:

      @using (Html.BeginForm("MyStep1", "Wizard"))
      {
          var properties = new Dictionary<string, object>();
          ReflectionHelper.IterateProps(Model, Model.GetType().Name,ref properties);
          foreach (var property in properties)
          {
              <input type="hidden" name="@property.Key" value="@property.Value"/>
          }
      }
      

      它是wizard解决方案的一部分,以后我会写一篇关于mvc上wizard的文章,也许有人会觉得有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-08
        • 2011-10-08
        • 1970-01-01
        • 2011-09-13
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多