我正在寻找自动在视图中创建隐藏字段的方法。 这是我的模特:
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);
...
答案 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上写关于向导的文章,也许有人会觉得有用。