在发布后投射动态属性(模型绑定)

时间:2011-11-09 01:03:20

标签: asp.net-mvc-3

我拥有的是一个具有动态属性的模型。此动态属性包含大约50个不同对象中的一个。此模型将发送到视图,该视图基于使用的对象动态创建页面。这是完美的工作......问题是回发。当模型回发时,模型绑定器无法绑定动态属性。我期待这一点,并认为我能够处理它,但我尝试的任何东西都不适用于为每个不同的对象做出动作。

模型

public class VM_List
{
    public Config.CIType CIType { get; set; }
    public dynamic SearchData { get; set; }
   //Lots of static fields
}

这有效

public ActionResult List_Person(VM_List Model, VM_Person_List SearchData)
{
Model.SearchData = SearchData;
//Stuff
}

public ActionResult List_Car(VM_List Model, VM_Car_List SearchData)
{
Model.SearchData = SearchData;
//Stuff
}

但我想要的只是一个动作

public ActionResult List(VM_List Model)
{
    //Stuff
}

我尝试过像

这样的事情
public ActionResult List(VM_List Model)
{

        switch (Model.CIType)
        {
            case Config.CIType.Person:
                UpdateModel((VM_Person_List)Model.SearchData);
                break;
            default:
                SearchData = null;
                break;
        }

    //Stuff
}

和自定义模型绑定器

CIType CIType = (CIType)bindingContext.ValueProvider.GetValue("CIType").ConvertTo(typeof(CIType));

switch (CIType)
{
            case Config.CIType.Person:
                SearchData = (VM_Person_List)bindingContext.ValueProvider.GetValue("SearchData").ConvertTo(typeof(VM_Person_List));
                break;
            default:
                SearchData = null;
                break;
        }

但我无法上班。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在尝试了许多不同的事情后,我终于找到了一种有效的方法。

动作:

public ActionResult List(VM_List Model)
{

//If the defaultmodelbinder fails SearchData will be an object
if(Model.SearchData.GetType() == typeof(object))
{

//Get SearchData as a Dictionary
Dictionary<string, string> DSearchData = Request.QueryString.AllKeys.Where(k => k.StartsWith("SearchData.")).ToDictionary(k => k.Substring(11), k => Request.QueryString[k]);

switch (Model.CIType)
{
                case Config.CIType.Person:
                    Model.SearchData = new VM_Person_List(DSearchData);
                    break;
                case Config.CIType.Car:
                    Model.SearchData = new VM_Car_List(DSearchData);
                    break;
}

//Rest of action
//..
        }

并为每个对象创建一个接受字典的构造函数

public VM_Car_List(Dictionary<string, string> DSearchData)
{
    this.Make = Convert.ToInt32(DSearchData["Make"]);
    this.Model = Convert.ToInt32(DSearchData["Model"]);
    this.Year = Convert.ToInt32(DSearchData["Year"]);
    // ETC
}