Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常过帐,视图模型具有dictionary属性,由enum设置关键字,类为值_C#_Asp.net Mvc_Asp.net Mvc 4_Spark View Engine - Fatal编程技术网

C# 异常过帐,视图模型具有dictionary属性,由enum设置关键字,类为值

C# 异常过帐,视图模型具有dictionary属性,由enum设置关键字,类为值,c#,asp.net-mvc,asp.net-mvc-4,spark-view-engine,C#,Asp.net Mvc,Asp.net Mvc 4,Spark View Engine,编辑:我不确定以前是怎么漏掉的,但这可能是重复的 我使用的是ASP.NET MVC4,我有一个字典属性,该属性在枚举上设置了键,并且有一个类作为其值类型。我正在使用Html.TextBoxFor为表单生成Html,并将其中一个作为视图模型的控制器操作。当我通过浏览器提交表单时,我在绑定过程中收到一个InvalidCastException 以下是视图模型: public class MyViewModel { public virtual IDictionary<MyEnumTyp

编辑:我不确定以前是怎么漏掉的,但这可能是重复的

我使用的是ASP.NET MVC4,我有一个字典属性,该属性在枚举上设置了键,并且有一个类作为其值类型。我正在使用
Html.TextBoxFor
为表单生成Html,并将其中一个作为视图模型的控制器操作。当我通过浏览器提交表单时,我在绑定过程中收到一个
InvalidCastException

以下是视图模型:

public class MyViewModel
{
    public virtual IDictionary<MyEnumType, IList<MySubViewModel>> Subs { get; set; }

    public class MySubViewModel
    {
        public virtual String Name { get; set; }
   }
}
这是堆栈跟踪。(我有一个不同类型的模型活页夹,但对于这个dictionary属性,它只是传递到
base.BindModel

[InvalidCastException:指定的强制转换无效。]
System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary,IEnumerable`1 newContents)+131
[TargetInvocationException:调用的目标已引发异常。]
System.RuntimeMethodHandle.InvokeMethod(对象目标、对象[]参数、签名符号、布尔构造函数)+0
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象obj,对象[]参数,对象[]参数)+92
System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、Binder Binder、对象[]参数、CultureInfo区域性)+108
System.Reflection.MethodBase.Invoke(对象obj,对象[]参数)+19
System.Web.Mvc.CollectionHelpers.ReplaceDictionary(类型keyType、类型valueType、对象字典、对象newContents)+178
System.Web.Mvc.DefaultModelBinder.UpdateDictionary(ControllerContext ControllerContext,ModelBindingContext bindingContext,Type keyType,Type valueType)+1211
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+921
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+416
Namespace.For.MyBinder.BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+1195
System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext ControllerContext、ModelBindingContext bindingContext、PropertyDescriptor PropertyDescriptor、IModelBinder propertyBinder)+17
System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext ControllerContext,ModelBindingContext bindingContext,PropertyDescriptor PropertyDescriptor)+384
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext ControllerContext,ModelBindingContext bindingContext)+88
System.Web.Mvc.DefaultModelBinder.BindCompleteXelementalModel(ControllerContext ControllerContext,ModelBindingContext bindingContext,Object model)+53
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+1314
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+416
Namespace.For.MyBinder.BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+1195
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext ControllerContext,ParameterDescriptor ParameterDescriptor)+317
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)+117
System.Web.Mvc.Async.c__显示类25.b__1e(AsyncCallback AsyncCallback,Object asyncState)+446
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(异步回调,对象状态,Int32超时)+130
System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext ControllerContext,String actionName,AsyncCallback回调,对象状态)+302
System.Web.Mvc.c_uuudisplayClassId.b_uuu17(异步回调,异步回调,对象异步状态)+30
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(异步回调,对象状态,Int32超时)+130
System.Web.Mvc.Controller.BeginExecuteCore(异步回调,对象状态)+382
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(异步回调,对象状态,Int32超时)+130
System.Web.Mvc.Controller.BeginExecute(RequestContext RequestContext,AsyncCallback回调,对象状态)+317
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext RequestContext,AsyncCallback回调,对象状态)+15
System.Web.Mvc.c_uuudisplayClass8.b_uuu2(异步回调,异步回调,对象异步状态)+71
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(异步回调,对象状态,Int32超时)+130
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,异步回调,对象状态)+249
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext HttpContext,异步回调,对象状态)+50
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.BeginProcessRequest(HttpContext上下文,AsyncCallback cb,Object extraData)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+301
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+155

您似乎忘记了在
POST
操作中重新填充
MyViewModel
Subs
属性。您必须在
GET
POST
请求中执行此操作

您可以将其重构为一个方法,并在两个操作中调用它:

private Dictionary<MyEnumType, IList<MyViewModel.MySubViewModel>> GetSubsDict()
{
    return new Dictionary<MyEnumType, IList<MyViewModel.MySubViewModel>>() 
                {
                    {
                        MyEnumType.MySubViewModel, 
                        new List<MyViewModel.MySubViewModel>
                        {
                            new MyViewModel.MySubViewModel
                            {
                                Name = "Foo-Bar"
                            }
                        }
                    }
                }
}
在行动后再次:

public ActionResult EditPage(MyViewModel model)
{
    model.Subs = GetSubsDict();
    return View(model);
}

执行永远不会到达后操作。发布的数据不绑定。如果我在POST操作的第一行中放置断点,它将永远不会到达。谢谢你的回答。
<tbody>
    <tr>
        <td>
            <input id="Subs_EnumValueOne__0__Name" type="text" value="Foo-Bar" name="Subs[EnumValueOne][0].Name">
        </td>
    </tr>
</tbody>
at System.Web.Mvc.DefaultModelBinder.CollectionHelpers.ReplaceDictionaryImpl[TKey,TValue](IDictionary`2 dictionary, IEnumerable`1 newContents)
[InvalidCastException: Specified cast is not valid.]
   System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +92
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +108
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19
   System.Web.Mvc.CollectionHelpers.ReplaceDictionary(Type keyType, Type valueType, Object dictionary, Object newContents) +178
   System.Web.Mvc.DefaultModelBinder.UpdateDictionary(ControllerContext controllerContext, ModelBindingContext bindingContext, Type keyType, Type valueType) +1211
   System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +921
   System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416
   Namespace.For.MyBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1195
   System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) +17
   System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +384
   System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +88
   System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +53
   System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1314
   System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416
   Namespace.For.MyBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1195
   System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317
   System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
private Dictionary<MyEnumType, IList<MyViewModel.MySubViewModel>> GetSubsDict()
{
    return new Dictionary<MyEnumType, IList<MyViewModel.MySubViewModel>>() 
                {
                    {
                        MyEnumType.MySubViewModel, 
                        new List<MyViewModel.MySubViewModel>
                        {
                            new MyViewModel.MySubViewModel
                            {
                                Name = "Foo-Bar"
                            }
                        }
                    }
                }
}
public ActionResult EditPage(Int32? id)
{
    MyViewModel testViewModel = new MyViewModel
                                    {
                                        Subs = GetSubsDict();
                                    }
    return View(testViewModel);
}
public ActionResult EditPage(MyViewModel model)
{
    model.Subs = GetSubsDict();
    return View(model);
}