如何自动为模型制作隐藏字段?

时间:2012-07-03 10:41:15

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

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

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);

...

3 个答案:

答案 0 :(得分:1)

如果您想要执行此类操作,可能最好使用辅助工具和反射。

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

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

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

interface IHasComplexType
{
    ComplexType  GetComplexType();
}

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

还有其他方法可以做到这一点,但你可以进行反思,帮手可能也很容易。

答案 1 :(得分:0)

在您的视图中,您可以使用:

@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;}
    ...
}

答案 2 :(得分:0)

我已经完成了下一个解决方案: '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"/>
    }
}

它是向导解决方案的一部分,稍后我将在MVC上写关于向导的文章,也许有人会觉得有用。