我使用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
中使用动态类型,因为有三个视图调用该函数,每个视图都有不同的模型。每个功能几乎完全相同。我没有使用继承,因为我在早期搞砸了太多,现在需要花费太多的工作来修复。
答案 0 :(得分:4)
This post确认(没有来源)我的guess默认模型绑定器无法真正使用id
参数。
默认模型绑定器查找参数类型的现有属性(dynamic
非常少),然后尝试将发布的字段映射到这些属性。
变通办法是使用public ActionResult TaskEdit(FormCollection formCollection)
并在控制器中填写您的模型,或use a custom modelbinder。
答案 1 :(得分:2)
是模型绑定问题。您正在向具有3种类型模型的单个方法发送发布请求。该方法必须接受该模型并向您公开其值。有几种方法可以实现这一目标 -