Приведите динамический атрибут после его публикации (привязка модели) - PullRequest
1 голос
/ 09 ноября 2011

То, что у меня есть, - это модель, у которой один из ее атрибутов динамический. Этот динамический атрибут содержит один из 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 голосов
/ 10 ноября 2011

Попробовав много разных вещей, я наконец нашел способ, который работает.

Действие:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...