您好我正在使用自定义模型绑定器与asp.net mvc 2.0,一切都在本地工作,但当部署到服务器运行iis 7时,我得到一个奇怪的错误,很难得到有关错误的信息如下,我我还附加了我的模型绑定类
错误:
[MissingMethodException: Method not found: 'System.Collections.Generic.IDictionary`2<System.String,System.Web.Mvc.ValueProviderResult> System.Web.Mvc.ModelBindingContext.get_ValueProvider()'.]
FID.Binders.documentModelBinder.GetValue(ModelBindingContext bindingContext, String key) in C:\Users\Bich Vu\Documents\Visual Studio 2010\Projects\FID\FID\Binders\DocumentModelBinder.cs:155
FID.Binders.documentModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) in C:\Users\Bich Vu\Documents\Visual Studio 2010\Projects\FID\FID\Binders\DocumentModelBinder.cs:61
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +475
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +152
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
System.Web.Mvc.Controller.ExecuteCore() +162
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371 Below is the code file
代码:
public class BinddocumentAttribute : DataBindAttribute
{
public BinddocumentAttribute() : base(typeof(documentModelBinder)) { }
public class documentModelBinder : DefaultModelBinder
{
ICategoryService _CategoryService= ServiceLocator.Current.GetInstance<ICategoryService>();
IFilePersistor _persistor = ServiceLocator.Current.GetInstance<IFilePersistor>();
IFileTypeService _FiletypeService = ServiceLocator.Current.GetInstance<IFileTypeService>();
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var doc = base.BindModel(controllerContext, bindingContext) as Document;
string key = bindingContext.ModelName;
var errors = Core.xval.DataAnnotationsValidationRunner.GetErrors(doc);
try
{
if (errors.Any())
throw new xVal.ServerSide.RulesException(errors);
foreach (string inputTagName in controllerContext.HttpContext.Request.Files)
{
HttpPostedFileBase filebase = controllerContext.HttpContext.Request.Files[inputTagName];
if (filebase.ContentLength==0)
break;
string extension= Path.GetExtension(filebase.FileName);
if (!filebase.ContentType.Contains("image/"))
{
if (extension != _FiletypeService.GetFiletype(GetValue<short>(bindingContext, "Filetype_id")).extension.Trim())
{
bindingContext.ModelState.AddModelError("filetype", "Verify that the file type matches the selected file type");
throw new RulesException("filetype", "Verify that the file type matches the selected file type", doc);
}
}
}
}
catch (xVal.ServerSide.RulesException ex)
{
return null;
}
doc.Category1 = _CategoryService.GetCategory(GetValue<int>(bindingContext, "cat.parent_id"));
doc.FileType1 = _FiletypeService.GetFiletype(GetValue<short>(bindingContext, "Filetype_id"));
doc.modifieddate = DateTime.Now;
if (doc.IsNewDocument)
{
doc.CreateParentFolders();
doc.createdate = DateTime.Now;
}
UpdateFiles(controllerContext, doc);
return doc;
}
private void UpdateFiles(ControllerContext controllerContext, Document doc)
{
foreach (string inputTagName in controllerContext.HttpContext.Request.Files)
{
HttpPostedFileBase filebase = controllerContext.HttpContext.Request.Files[inputTagName];
if (filebase.ContentLength > 0)
{
if (filebase.ContentType.Contains("image/"))
{
Thumb image = new Thumb { type = filebase.ContentType, name = filebase.FileName, PostedFile = filebase, AssociatedDocument = doc, document_id=doc.document_id };
image.filepath = _persistor.PersistFile(image);
doc.Thumbs.Add(image);
}
else
{
doc.PostedFile = filebase;
doc.filesize = long.Parse(filebase.ContentLength.ToString());
doc.filepath = _persistor.PersistFile(doc);
}
}
}
}
private T GetValue<T>(ModelBindingContext bindingContext, string key)
{
ValueProviderResult valueResult;
bindingContext.ValueProvider.TryGetValue(key, out valueResult);
bindingContext.ModelState.SetModelValue(key, valueResult);
return (T)valueResult.ConvertTo(typeof(T));
}
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var document = bindingContext.Model as Document;
if (String.IsNullOrEmpty(document.title))
{
bindingContext.ModelState.AddModelError("Name", "...");
}
}
}
答案 0 :(得分:3)
首先,您应该确保运行正确的程序集
二 在MVC2中,以下内容无效。 IValueProvider接口已更改
bindingContext.ValueProvider.TryGetValue(key, out valueResult);
应替换为
valueResult = bindingContext.ValueProvider.GetValue(key);
答案 1 :(得分:0)
缺少方法异常听起来就像您的推送机器上的代码编译成功,但引用的DLL没有将其发送到您的生产服务器。我会检查bin是否包含不同数量的DLL,每个DLL的版本,以及生产机器是否缺少GAC的某些DLL。