Asp.net mvc custom model binding

Hi I am using a custom nexus with asp.net mvc 2.0, everything works locally, but when deploying to a server running iis 7, I get a strange error which is hard to get the error information, the following: I am also attaching a model binding class

Error:

[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

      

the code:

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", "...");
        }
    }
}

      

+2


a source to share


2 answers


You must first make sure you are doing the correct builds

Secondly In MVC2 the following is not valid. IValueProvider interface has changed

bindingContext.ValueProvider.TryGetValue(key, out valueResult); 

      



should be replaced with

valueResult = bindingContext.ValueProvider.GetValue(key); 

      

+3


a source


The method thrown exception looks like where your code was successfully compiled on your push machine, but the DLL link didn't go out to your production server. I would check if there will be a different number of DLLs in the bin, what versions of each DLL are there, and if your production machine is missing specific DLLs from the GAC.



0


a source







All Articles