Diogo Teixeira
Diogo Teixeira

Reputation: 91

How can I fix the cannot convert type error?

I want to create a details page about a movie, but I´m getting this error and I´m kinda stuck. I'm getting a cant convert type error. I do understand the error, but I dont have any idea of how to fix it.

This is the Index the PAP Entities is the Database instance:

public class MoviesController : Controller
{

    PAPEntities db = new PAPEntities();


    public ActionResult Index()
    {

        MovieViewModel[] movies = db.MoviesData.Select(movie => new MovieViewModel
        {
            MovieID = movie.MovieID,
            MovieName = movie.MovieName,
            MovieDescription = movie.MovieDescription,
            MovieCategory = movie.MovieCategory,
            MovieYear = movie.MovieYear
        }).ToArray();

        return View(movies);

    }

And this is my details class for now:

public ActionResult Details(int Id = 1)
    {
        MovieViewModel MovieVM = db.MoviesData.Find(Id);
        return View(MovieVM);
    }

I keep getting the error on the "db.MoviesData.Find(Id);"

This is the MovieViewModel code:

public class MovieViewModel
{
    public int MovieID { get; set; }
    public string MovieName { get; set; }
    public string MovieDescription { get; set; }
    public string MovieCategory { get; set; }
    public string MovieYear { get; set; }
}

This is the razor page:

@model WebApplication3.Models.MovieViewModel[]


@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Movies</h2>

<p>
@Html.ActionLink("Create New", "Create")

<table class="table table-bordered table-responsive table-hover">
    <tr>
        <th><b>Movie Name </b></th>
        <th><b>Movie Category </b></th>
        <th><b>Movie Year </b></th>
        <th><b>Movie Description </b></th>
        <th></th>


    </tr>
    @foreach (var item in Model)
    {
    <tr>
        <td>@item.MovieID</td>
        <td>@item.MovieCategory</td>
        <td>@item.MovieYear</td>
        <td>@item.MovieDescription</td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.MovieID }) |
            @Html.ActionLink("Details", "Details", new { id = item.MovieID }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.MovieID })
        </td>
    </tr>
    }
</table>

This is the error:

Cannot implicitly convert type 'WebApplication3.Models.MoviesData' to 'WebApplication3.Models.MovieViewModel'

The MoviesData is the database's table

Upvotes: 0

Views: 972

Answers (2)

heuristican
heuristican

Reputation: 294

You should map your DB (MoviesData) model To Bussiness model (MovieViewModel)

   public ActionResult Details(int Id = 1)
    {
        MoviesData movie = db.MoviesData.Find(Id);
        MovieViewModel MovieVM = new MovieViewModel();
        MovieVM.MovieID = movie.MovieID;
        MovieVM.MovieName = movie.MovieName;
        MovieVM.MovieDescription = movie.MovieDescription;
        MovieVM.MovieCategory = movie.MovieCategory;
        MovieVM.MovieYear = movie.MovieYear;

        return View(MovieVM);
    }

Upvotes: 1

Abdur Rahim
Abdur Rahim

Reputation: 540

In your ActionResult Details method db.MoviesData.Find(Id) returns object which type is WebApplication3.Models.MoviesData but your variable type is MovieViewModel. That's why you are getting exception.

You need to cast manually. So, You can code like this,

public ActionResult Details(int Id = 1)
{
    MoviesData movie = db.MoviesData.Find(Id);
    MovieViewModel MovieVM = new MovieViewModel{
        MovieID = movie.MovieID,
        MovieName = movie.MovieName,
        MovieDescription = movie.MovieDescription,
        MovieCategory = movie.MovieCategory,
        MovieYear = movie.MovieYear
    };

    return View(MovieVM);
}

Upvotes: 0

Related Questions