ASP.NET MVC2强类型视图数据绑定问题

时间:2010-10-26 04:12:39

标签: asp.net-mvc data-binding view controller

我首先会说我的术语可能已经关闭,这就是为什么我可能无法找到这个问题的答案,并为文本墙道歉。

我有一个强类型视图,它继承自名为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方法将“看到”模型的内容有关?

3 个答案:

答案 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可能有所帮助。