【问题标题】:Using Base Class as overload in MVC Action, but collecting all data在 MVC 操作中使用基类作为重载,但收集所有数据
【发布时间】:2012-11-13 17:56:25
【问题描述】:

我目前有 2 个类继承了基本的 BaseGridRowModel,例如:

  • PersonRowModel
  • CityRowModel

我创建了一个控制器,它接受基础作为输入,并将其推送到缓存以供以后使用。

   [HttpPost]
   public ActionResult RowCheckedStatusChanged(BaseGridRowModel row)
   {
       try
       {

然后我调用该方法,在 ajax 调用中将网格行推送到控制器。

       $.ajax({
           type: 'POST',
           url: "/Central/MyGrid/RowCheckedStatusChanged",
           data: rowData.toJSON(),
           cache: false,

但是,所有额外的字段都丢失了,因为它们不是基础的一部分。这总是变为 null 并引发异常。

          var rowData = (row as PersonRowModel);
          if (rowData == null)
          {
             throw new Exception("Row must inherit BaseGridRowModel.");
          }

稍后我需要这些字段来从缓存中取回。有什么办法拯救他们吗?

谢谢

【问题讨论】:

  • 您的问题不够详细。看来您的缓存可能是问题所在,但您什么也没说,更不用说有任何代码了。 MOAR 细节!

标签: c# javascript asp.net-mvc asp.net-mvc-3 overloading


【解决方案1】:

问题是模型绑定器将您的数据绑定到 BaseGridRowModel。本质上,它是将发布的数据反序列化为 BaseGridRowModel。

所以模型绑定器不够聪明,无法识别额外的字段并神奇地确定有一个类继承自动作中的类并使用它。

如果您想要这些数据,您可能会认为可以为各种类型创建重载,然后将其汇集到通用版本中,但我相信这也行不通。您可以创建自己的自定义模型绑定器,该绑定器将查找额外数据并创建正确的类型,然后有效地将其向上转换为 BaseGridRowModel

或者,您可以只查看 HttpContext.Current.Request.Form 以获取额外的字段。或者您可以将字段添加到方法中......即......

public ActionResult RowCheckedStatusChanged(BaseGridRowModel row, string otherdataItem1, string otherdataItem2)

【讨论】:

  • 谢谢。我最终使用 HttpContext.Current.Request.Form 和 UpdateModel 来填充我作为额外参数传递的构造类型。但是需要这样做来解决反射问题:forums.asp.net/t/1697700.aspx/…
猜你喜欢
  • 2023-03-16
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多