1

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

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

...
4

3 回答 3

1

如果您有许多类型要为此执行此操作,那么助手和反射可能是最好的。

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

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

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

interface IHasComplexType
{
    ComplexType  GetComplexType();
}

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

还有其他方法可以做到这一点,但是您会进行反思,并且帮助者可能同样容易。

于 2012-07-03T12:23:57.353 回答
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;}
    ...
}
于 2012-07-03T18:58:18.503 回答
0

我已经完成了下一个解决方案:“ReflectionHelper”类反映模型属性,并且在“属性”变量中是模型字段 {{'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 上写有关向导的文章,也许有人会发现有用。

于 2012-07-04T10:08:50.720 回答