View将匿名类型传递给控制器

时间:2015-09-04 17:31:35

标签: c# asp.net-mvc

我使用C#和MVC 5,但出于某种原因,我的观点是将匿名类型传回控制器,并且对此并不满意。具体错误是:

An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code

Additional information: 'object' does not contain a definition for 'Id'

这是特定的控制器功能签名:

[HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")]
public ActionResult TaskEdit(dynamic model, bool continueEditing)

当我尝试在该函数中引用model.Id时发生错误。视图的开头是这样的:

@model ProjectModelShopModel
// ...
@using (Html.BeginForm(null, null, FormMethod.Post, Model))
{
    // code
}

如何解决此错误?如有必要,我可以提供更多代码。

编辑:我在TaskEdit中使用动态类型,因为有三个视图调用该函数,每个视图都有不同的模型。每个功能几乎完全相同。我没有使用继承,因为我在早期搞砸了太多,现在需要花费太多的工作来修复。

2 个答案:

答案 0 :(得分:4)

This post确认(没有来源)我的guess默认模型绑定器无法真正使用id参数。

默认模型绑定器查找参数类型的现有属性(dynamic非常少),然后尝试将发布的字段映射到这些属性。

变通办法是使用public ActionResult TaskEdit(FormCollection formCollection)并在控制器中填写您的模型,或use a custom modelbinder

答案 1 :(得分:2)

是模型绑定问题。您正在向具有3种类型模型的单个方法发送发布请求。该方法必须接受该模型并向您公开其值。有几种方法可以实现这一目标 -

  1. 创建自己的模型装订器

    [HttpPost]
    [ModelBinder(typeof(CustomModelBinder))]
    
  2. CustomModelBinder是默认模型绑定器的扩展。您可以找到实施here

    1. 使用表单集合而不是绑定到特定模型来获取数据

      [HttpPost]
      public ActionResult ActionName(FormCollection formData) 
      {
          var variablename = Request.Form["VariableName"]; 
      }
      
    2. 您可以找到示例here

      修改 formcollection的修改示例链接