相关疑难解决方法(0)

带有嵌套列表的ASP.NET MVC DefaultModelBinder

我有一个表格,表格代表员工的时间表.顶部的天数,项目的侧面,每天/项目交叉点包含常规小时和加班的两个值.

页面模型的(简化)类定义是:

public class TimesheetFormModel {
    public List<Project> Projects;
    // other things...
}
public class Project {
    public string Name;
    public List<WorkUnit> WorkUnits;
}
public class WorkUnit {
    public DateTime Date;
    public decimal RegularHours;
    public decimal OvertimeHours;
}
Run Code Online (Sandbox Code Playgroud)

页面上的表单元素如下命名,试图让DefaultModelBinder获取它们.

model.Projects[0].Name // "New Project"
model.Projects[0].WorkUnits[0].Date // "5/23/2009 12:00:00 AM"
model.Projects[0].WorkUnits[0].RegularHours // 0
model.Projects[0].WorkUnits[0].OvertimeHours // 0

model.Projects[0].WorkUnits[1].Date // "5/24/2009 12:00:00 AM"
model.Projects[0].WorkUnits[1].RegularHours // 0
model.Projects[0].WorkUnits[1].OvertimeHours // 0

model.Projects[0].WorkUnits[2].Date // "5/25/2009 12:00:00 AM"
model.Projects[0].WorkUnits[2].RegularHours // 0
model.Projects[0].WorkUnits[2].OvertimeHours // 0

// etc.
Run Code Online (Sandbox Code Playgroud)

但是,提交视图时,model …

asp.net asp.net-mvc defaultmodelbinder

13
推荐指数
1
解决办法
3771
查看次数

通过反射动态调用textboxfor

我试图做的最终结果是通过反映对象及其属性来动态构建表单。

我已经创建了调用TextBoxFor和CheckBoxFor等的HtmlHelper方法,但是现在我需要帮助弄清楚如何将属性传递给Html.TextBoxFor时正确反映该属性。

这是辅助方法:

public static MvcHtmlString FormTextBox<TModel>(this HtmlHelper<TModel> helper, String id, String property_name, object model, RouteValueDictionary attributes)
    {          
        Type model_type = model.GetType();

        return helper.TextBoxFor(model_object => model_type.InvokeMember(property_name, BindingFlags.ExactBinding | BindingFlags.GetProperty, null, model, null));
    }
Run Code Online (Sandbox Code Playgroud)

但是它会在返回时中断,并显示以下错误代码:

模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。

基本上我想知道这是什么:

@Html.TextBoxFor(model => model.Name)
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

@FormHelpers.FormTextBox("Name", model)
Run Code Online (Sandbox Code Playgroud)

并输出相同的内容。

更新

我将重申这一点,因为我在解决问题上取得了一些进展。

我已经从Expression.PropertyOrField创建了一个表达式,该表达式恰好创建了我要寻找的东西。但是我不能让TextBoxFor函数接受它。

Expression fieldExpr = Expression.PropertyOrField(Expression.Constant(model),property_name);

        return helper.TextBoxFor(Expression.Lambda<Func<TModel>>(fieldExpr, null).Compile()());
Run Code Online (Sandbox Code Playgroud)

关于如何正确将Expression传递给函数的任何想法?

c# reflection asp.net-mvc html-helper

2
推荐指数
1
解决办法
2666
查看次数