Search code examples
asp.net-mvcmodel-view-controllerumbracoumbraco7

Umbraco - custom model causing problems?


In a vanilla Umbraco project, i am importing a vanilla MVC app. I am currently beeing held up, by this error:

Cannot bind source type eParser.Model.MyModel to model type MyNamespace.Controllers.ViewModel`1[[eParser.Model.MyModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].

This is my code:

Local project

namespace MyNamespace.Controllers
{
    public class MyOutputController : RenderMvcController
    {
        private static Parser _parser;

        public MyOutputController()
        {
            _parser = new Parser(@"localfile.txt");
        }

        public override ActionResult Index(RenderModel model)
        {
        var settings = new RPSettings();
        var wsParser = _parser.GetwsParser();
            var result = wsParser.GetDataAsMyModel(settings);
        return View("MyView", result);
    }
     }

    public class ViewModel<TModel> : RenderModel
    {
        public ViewModel(RenderModel model) : base(model.Content, model.CurrentCulture) { }

        public TModel MyModel { get; set; }
    }
}

External project

namespace eParser
{
    public class wsParser
    {
    public MyModel GetDataAsMyModel(RPSettings settings)
        {
            var model = new MyModel();
        return model;
    }
    }
}

namespace eParser.Model
{
    public class MyModel
    {
        public string Name { get; set; }
        public string Value1 { get; set; }
        public bool IsValid { get; set; }
    }
}

Template

@using MyNamespace.Controllers
@using OtherNamespace.Models
@inherits Umbraco.Web.Mvc.UmbracoViewPage<ViewModel<MyModel>>
@{
    Layout = "/Views/Shared/_Layout.cshtml"; //Just <html> and very basic - no code
    var addModel = new AddListViewModel
    {
        MyType = MyType.Value1,
        MyModel = Model
    };
}

<h1>@Model.Name</h1>


namespace OtherNamespace.Models
{
    public class AddListViewModel
    {
        public string ValueName { get; set; }
        public MyType MyType { get; set; }
        public ViewModel<MyModel> MyModel { get; set; }
    }
}

Any ideas what i could do to fix it?


Solution

  • Your Index method is wrong - you are passing in your model to the view but you should be passing your view model instead.

    It should be:

    public override ActionResult Index(RenderModel model)
    {
        var settings = new RPSettings();
        var wsParser = _parser.GetwsParser();
        var result = wsParser.GetDataAsMyModel(settings);
    
        var viewModel = new ViewModel<MyModel>(model);
        viewModel.MyModel = result;
    
        return View("MyView", viewModel );
    }