2

Hi I am using a custom model binder with asp.net mvc 2.0 , everything works locally but when deployed to the server runing iis 7, i get a weird error which is hard to get information about the error is as follows, I am also attaching my 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

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", "...");
        }
    }
}
3
  • Does your server have the correct version of .NET framework installed? Commented Apr 29, 2010 at 15:11
  • could a difference in the versions of system.web.mvc be the reason, I was wondering the same thing, my local version is v2.0.50727 while the server version is 2.0.50217.0 Commented Apr 29, 2010 at 15:20
  • the server is running .net framework 4.0 Commented Apr 29, 2010 at 15:21

2 Answers 2

3

First you should make sure your running the correct assemblies

Second In MVC2 the following is not valid. The IValueProvider Interface has changed

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

should be replaced with

valueResult = bindingContext.ValueProvider.GetValue(key); 
Sign up to request clarification or add additional context in comments.

2 Comments

Thats was the perfect answer, Thanks John. The different versions of asp.mvc was the problem
Not a problem I ran in to a similar issue when going from MVC 1 to MVC 2.
0

A missing method exception sounds like where your code compiled successfully on your push machine, but a referenced DLL didn't make it out to your production server. I'd check to see if the bin contains a different number of DLLs, what versions of each DLL are out there, and if your production machine is missing certain DLLs from the GAC.

2 Comments

could a difference in the versions of system.web.mvc be the reason, I was wondering the same thing, my local version is v2.0.50727 while the server version is 2.0.50217.0
Definitely. Always verify the same DLL versions you used to build are the same ones in prod.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.