Обновление ссылки на класс после получения через форму

Что ж,

Давайте предположим, что у меня есть два класса Model:

public class BaseClass{
    public Int32 variable {get;set;}
}

public class DerivatedClass : BaseClass{
    public Int32 otherVariable {get;set;}
} 

И представление с типом BaseClass в качестве модели.

Если я передам DerivatedClass в View и получу информацию через форму, он не будет снова "преобразован" в DerivatedClass?

Проблема заключается в том, что если я получаю тип модели внутри представления (Model.GetType().FullName), я получаю (без сюрпризов) тип DerivatedClass.

Но когда я проверяю опубликованную модель, внутри моего контроллера я получаю BaseClass (и, очевидно, он не может быть приведен!)

контроллер:

public ActionResult ViewPage(){
    return View(new DerivatedClass());
}

[HttpPost]
public ActionResult ViewPage(BaseClass b){
    b.GetType().FullName;                 //Gives me Project.packeges.BaseClass.
    DerivatedClass d = (DerivatedClass)b; //Ops, It can't be done. Exception.
}

Посмотреть:

@model Project.packeges.BaseClass

<h3>@Model.GetType().FullName</h3>  
<!-- Gives me Project.packeges.DerivatedClass -->
...

Моя логика неверна? Есть ли способ сделать это приведение внутри контроллера после получения информации POST?

1 ответ

Решение

Связыватель модели создаст объект BaseClass и попытается назначить свойства.

Поэтому, когда элемент управления переходит к вашему посту, у него будет экземпляр класса BaseClass, а не дочерний класс.

Таким образом, это исключение во время каста.

Ваше требование может быть выполнено с помощью CustomModelBinder и Create Instance на DeriveClass, когда запрашивается экземпляр BaseClass.

Я ответил на аналогичный пост, с полным описанием.

Пожалуйста, загляните в " MyPost". Это может быть то, что вы ищете.

Другие вопросы по тегам