我正在构建一个页面来编辑不同的产品类型。每个产品类型都有一个视图模型(TentProductVM、BootProductVM),该模型继承自ProductVM。我的MVC2视图检查模型类型,并酌情添加字段。例如,如果模型是BootProductVM类型的,我调用Html.TextBoxFor来添加一个字段,用于引导的脚大小。页面显示得很好。
问题是职位问题。我声明了一个函数(在VB中)如下:
<HttpPost()>Function Edit(byval prod as ProductVM) As ActionResult当然,这个函数只接收来自基类ProductVM的表单数据。因此,我为每种产品类型添加了一个函数:
<HttpPost()>Function EditTent(byval prod as TentProductVM) As ActionResult
<HttpPost()>Function EditBoot(byval prod as BootProductVM) As ActionResult并将视图指向适当的post功能:
Using Html.BeginForm("Edit" & Model.ObjectTypeName, "Catalog")但是,当调用EditTent或EditBoot时,prod参数只包含基类中的数据。子类视图模型中声明的所有字段都保留默认值。
我做错了什么?还是有更好的方法?(显而易见的解决方案是多个页面,但由于ProductVM有许多相对于子类的字段,我宁愿不这样做。)
经过多次试验,我决定不使用这种方法。首先,如果不使用FormCollection类型的Action参数,就无法让它工作。第二,我抛弃的明显的解决方案是,如果我使用部分视图,就会有吸引力。部分视图包含与基类(ProductVM)关联的所有字段,仅在常规视图中保留与派生类(TentProductVM、BootProductVM)关联的字段。
我觉得我在和MVC自动魔术做斗争,这从来都不是正确的方法。
发布于 2011-05-03 17:50:04
关于MVC,要记住的是,它是基于“约定而不是配置”的思维方式。因此,如果要将强类型类实例传递给操作方法,则需要将其命名为"model“。
尝试将声明更改为如下所示:
<HttpPost()> Function EditTent(byval model as TentProductVM) As ActionResult
<HttpPost()> Function EditBoot(byval model as BootProductVM) As ActionResult另一个(不太理想的)选项是在操作方法中期望一个FormCollection对象。
<HttpPost()> Function EditTent(byval form as FormCollection) as ActionResult更新
只是更新一下,包括下面的一些讨论要点.为了将强类型对象发布到控制器操作方法,类型需要匹配。
假设控制器的操作方法如下所示:
<HttpPost()> Function EditTent(byval model as ProductVM) As ActionResult您的意见应按以下方式输入:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Your.Namespace.ProductVM>" %>https://stackoverflow.com/questions/5873386
复制相似问题