我首先会说我的术语可能已经关闭,这就是为什么我可能无法找到这个问题的答案,并为文本墙道歉。
我有一个强类型视图,它继承自名为Record的自定义类型。 Record有一个不同数据类型的命名字段的字典 - 一些字符串,一些整数,一些DateTime / TimeSpans。
通过表单上的dropdownlist onchange,我在我的控制器中找到了一个HttpPost Action方法 - 据我所知,当前视图的模型应该被'传递'到控制器方法。它似乎是这样做的,但只是部分:Record的DateTime和TimeSpan字段作为默认值。所有字符串,int等字段都很好。
我在后端发生的数据绑定期间通过Record代码进行调试,因为调用了HttpPost控制器方法并且似乎构造了一个新的空白Record,然后设置了各种属性 - 但是如果作为构建一个的一部分'blank'记录属性初始化为某个有效的非null值,从不调用这些属性的Set方法。
我的问题是 - 在这个数据绑定阶段实际发生了什么?这是我描述的吗?我是否必须将我的Record初始化的所有属性都作为空值才能正确地获取数据绑定?
编辑:记录(简化)
public class Record
{
public Record() : base()
{
fields.Add("Id", new FieldValue { DataType = typeof(int) });
fields.Add("StartDateTime", new FieldValue { DataType = typeof(DateTime) });
}
private Dictionary<string, FieldValue> fields = new Dictionary<string, FieldValue>();
public Dictionary<string, FieldValue> Fields
{
get
{
return fields;
}
}
public long? Id
{
get
{
FieldValue fieldValue = Fields["Id"];
return fieldValue != null ? (long?)fieldValue.Value : null;
}
set
{
SetFieldValue("Id", value);
}
}
public DateTime StartDateTime
{
get
{
FieldValue fieldValue = Fields["StartDateTime"];
if (fieldValue == null || fieldValue.Value == null)
{
return DateTime.MinValue;
}
else
{
return (DateTime)fieldValue.Value;
}
}
set
{
SetFieldValue("StartDateTime", value);
}
}
protected void SetFieldValue(string fieldName, object value)
{
Fields[fieldName] = new FieldValue(value);
}
}
FieldValues字典的值类:
public class FieldValue
{
internal FieldValue(object value)
{
DataType = value.GetType();
Value = value;
}
internal FieldValue()
{ }
public Type DataType { get; set; } //The data type of the field
public object Value { get; set; } //The value of the field
}
我显示一个强类型的记录视图,它在表单中显示StartTime,但不显示Id。当HttpPost发生时,处理该视图的HttpPosts的控制器方法收到一条记录,该记录与原始记录具有相同的Id,但是DateTime.MinValue的StartDateTime。
Edit2:我在视图中显示任何模型字段的方式是否与控制器HttpPost方法将“看到”模型的内容有关?
答案 0 :(得分:1)
原来这是几件事的结合:
我用来显示我的StartDateTime字段的视图代码结构不够,无法让默认数据工具拿起它。
<input id="StartDateTime" type="text" value="<%= Model.StartDateTime.ToString("g") %>" />
这不起作用。这也不是
<input id="StartDateTime" type="text" value="<%= Model.StartDateTime %>" />
这有效:
<%= Html.TextBoxFor(model => Model.StartDateTime)%>
第二个问题是我的StartDateTime文本字段被禁用(禁用了html属性=“禁用”) - 它仅用于查看,但禁用的字段不会在帖子上返回任何内容(如上所述{{3即使我确实使用了TextBoxFor HtmlHelper,它仍然无法正常工作。感谢大家的链接,现在我更了解了使数据绑定工作的重要属性。
答案 1 :(得分:0)
您是否正在寻找IModelBinder的实施? 有一个默认的IModelBinder
这是你在找什么?
答案 2 :(得分:0)
你有一个名为StartDateTime的表单字段吗?默认模型绑定器将表单字段的id与视图模型中的属性名称相匹配。如果您没有名为StartDateTime的表单字段,则模型绑定程序将不会填充该属性。
如果您需要跟踪值但不显示它,您可以随时使用页面上的隐藏框,以便返回值。
此外,由于日期和时间组件以及网页中使用的格式,它可能只是遇到了麻烦。 Scott Hanselman has a blog post可能有所帮助。