php mvc多态实例,asp.net mvc-多态模型绑定
我花了好一天的時(shí)間來(lái)解決一個(gè)密切相關(guān)的問(wèn)題的答案-盡管我不確定這是否是完全相同的問(wèn)題,但如果有人正在尋找解決同一問(wèn)題的解決方案,我會(huì)在這里發(fā)布。
就我而言,我有一個(gè)抽象的基本類(lèi)型,用于多種不同的視圖模型類(lèi)型。 因此,在主視圖模型中,我具有抽象基本類(lèi)型的屬性:
class View
{
public AbstractBaseItemView ItemView { get; set; }
}
我有許多AbstractBaseItemView子類(lèi)型,其中許多定義了自己的專(zhuān)有屬性。
我的問(wèn)題是,模型綁定器不查看附加到View.ItemView的對(duì)象的類(lèi)型,而是僅查看聲明的屬性類(lèi)型,即AbstractBaseItemView-并決定僅綁定在抽象類(lèi)型中定義的屬性, 忽略恰好在使用的特定于AbstractBaseItemView具體類(lèi)型的屬性。
解決方法不是很漂亮:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
// ...
public class ModelBinder : DefaultModelBinder
{
// ...
override protected ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType.IsAbstract && bindingContext.Model != null)
{
var concreteType = bindingContext.Model.GetType();
if (Nullable.GetUnderlyingType(concreteType) == null)
{
return new AssociatedMetadataTypeTypeDescriptionProvider(concreteType).GetTypeDescriptor(concreteType);
}
}
return base.GetTypeDescriptor(controllerContext, bindingContext);
}
// ...
}
盡管此更改讓人感覺(jué)很棘手,而且非常“系統(tǒng)”,但它似乎有效-并且據(jù)我所知,它不會(huì)帶來(lái)相當(dāng)大的安全風(fēng)險(xiǎn),因?yàn)樗鼪](méi)有綁定到CreateModel()中,因此不允許您 發(fā)布任何內(nèi)容并欺騙模型綁定器以創(chuàng)建任何對(duì)象。
它也僅在聲明的property-type是抽象類(lèi)型時(shí)才起作用,例如 抽象類(lèi)或接口。
與此相關(guān)的是,在我看來(lái),我在這里看到的覆蓋CreateModel()的其他實(shí)現(xiàn)可能僅在發(fā)布全新的對(duì)象時(shí)才起作用-并且在聲明的屬性時(shí)也會(huì)遇到我遇到的相同問(wèn)題 -type是抽象類(lèi)型。 因此,您很可能將無(wú)法在現(xiàn)有模型對(duì)象上編輯具體類(lèi)型的特定屬性,而只能創(chuàng)建新的屬性。
因此,換句話說(shuō),您可能需要將此替代方法集成到活頁(yè)夾中,以便還能夠正確地編輯在綁定之前添加到視圖模型中的對(duì)象...就我個(gè)人而言,我認(rèn)為這是一種更安全的方法,因?yàn)?我控制要添加的具體類(lèi)型-因此,控制器/操作可以通過(guò)簡(jiǎn)單地用空實(shí)例填充屬性來(lái)間接指定可能綁定的具體類(lèi)型。
我希望這對(duì)其他人有幫助...
總結(jié)
以上是生活随笔為你收集整理的php mvc多态实例,asp.net mvc-多态模型绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win7系统如何对磁盘碎片进行整理?
- 下一篇: [设计模式]开闭原则