Обновление ссылки на класс после получения через форму
Что ж,
Давайте предположим, что у меня есть два класса 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". Это может быть то, что вы ищете.