Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 5 - The type arguments for method "..." cannot be inferred from the usage. Try specifying the type arguments explicitly

I have been learning MVC 5 for the past couple of weeks. I have had little to no issues so far, until yesterday. Everything was working fine until last night when I opened up VS to work on my projects some.

My issues:

To get a few things out of the way, I have restarted my computer, repaired my VS installation, removed temp folders from AppData etc. I have exhausted every possible solution I could find. Now onto my issues.

First of all, I stopped working on my current project and created a new project using the same database model. The database is an Azure SQL database. For each of the objects I created my own class to apply data annotations that looks like this: (I removed all the data annotations as there were quite a few. The error still persists)

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace Dyad.GreenvilleFoodTrucks.Data
{
[MetadataType(typeof(LocationMetadata))]
public partial class Location
{
}

public class LocationMetadata
{
    public int ID { get; set; }
    public int TruckID { get; set; }
    public Nullable<System.DateTime> StartTime { get; set; }
    public Nullable<System.DateTime> EndTime { get; set; }
    public Nullable<System.DateTime> Date { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }
    public string State { get; set; }
    public string ZIP { get; set; }

    public virtual Truck Truck { get; set; }
}
}

And the object EF created from my database:

namespace Dyad.GreenvilleFoodTrucks.Data
{
using System;
using System.Collections.Generic;

public partial class Location
{
    public int ID { get; set; }
    public int TruckID { get; set; }
    public Nullable<System.DateTime> StartTime { get; set; }
    public Nullable<System.DateTime> EndTime { get; set; }
    public Nullable<System.DateTime> Date { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }
    public string State { get; set; }
    public string ZIP { get; set; }

    public virtual Truck Truck { get; set; }
}
}

I then made a scaffolded item using my newly created model with the context being the one that EF created, not ApplicationDBContext.

Now when I go into the generated views, the ViewBag.Title = "title"; gives me this error: "One or more types require to compile a dynamic expression cannot be found. Are you missing a reference?" Note that this happens on all the CRUD cshtml files as well as the index.

In addition to this, on every single @Html.LabelFor / @Html.DisplayNameFor as well as anything that ends in "For" gives me this error: "The type arguments for method 'System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>)' cannot be inferred from the usage. Try specifying the type arguments explicitly."

Here is what a view look like. This is all auto-generated so I have not changed anything.

@model Dyad.GreenvilleFoodTrucks.Data.Location

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Location</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.TruckID, "TruckID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("TruckID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.TruckID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.StartTime, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.StartTime, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.StartTime, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.EndTime, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.EndTime, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.EndTime, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Date, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Date, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Date, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Address, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.State, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.State, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.State, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.ZIP, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.ZIP, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.ZIP, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

And its controller:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Dyad.GreenvilleFoodTrucks.Data;

namespace Dyad.GreenvilleFoodTrucks.Controllers
{
public class LocationsController : Controller
{
    private GreenvilleFoodTrucksEntities db = new GreenvilleFoodTrucksEntities();

    // GET: Locations
    public ActionResult Index()
    {
        var locations = db.Locations.Include(l => l.Truck);
        return View(locations.ToList());
    }

    // GET: Locations/Details/5
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Location location = db.Locations.Find(id);
        if (location == null)
        {
            return HttpNotFound();
        }
        return View(location);
    }

    // GET: Locations/Create
    public ActionResult Create()
    {
        ViewBag.TruckID = new SelectList(db.Trucks, "ID", "Name");
        return View();
    }

    // POST: Locations/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,TruckID,StartTime,EndTime,Date,Description,Address,State,ZIP")] Location location)
    {
        if (ModelState.IsValid)
        {
            db.Locations.Add(location);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.TruckID = new SelectList(db.Trucks, "ID", "Name", location.TruckID);
        return View(location);
    }

    // GET: Locations/Edit/5
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Location location = db.Locations.Find(id);
        if (location == null)
        {
            return HttpNotFound();
        }
        ViewBag.TruckID = new SelectList(db.Trucks, "ID", "Name", location.TruckID);
        return View(location);
    }

    // POST: Locations/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ID,TruckID,StartTime,EndTime,Date,Description,Address,State,ZIP")] Location location)
    {
        if (ModelState.IsValid)
        {
            db.Entry(location).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.TruckID = new SelectList(db.Trucks, "ID", "Name", location.TruckID);
        return View(location);
    }

    // GET: Locations/Delete/5
    public ActionResult Delete(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Location location = db.Locations.Find(id);
        if (location == null)
        {
            return HttpNotFound();
        }
        return View(location);
    }

    // POST: Locations/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Location location = db.Locations.Find(id);
        db.Locations.Remove(location);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }
}
}

With all this addressed, I would also like to point that none of this happens when I run VS as admin, which I do not understand. Also, every compiles and runs as usual.

I apologize for the lengthy write-up, but I didn't want to leave anything out. I also apologize if I misused any terms as I am fairly new to MVC and C# in general.

If there is anything else I can include please let me know.

like image 667
Jonathan Carroll Avatar asked Oct 13 '14 17:10

Jonathan Carroll


2 Answers

This will sometimes happen when the web.config file within the view folders is referencing old or missing versions of MVC or Razor dependencies. If you can't manually fix it, or figure out which reference is at fault, the easiest thing to do is create a new MVC project and compare the web.config file from the View folder to the existing project's config files.

While it usually doesn't break anything when running or debugging, it does confuse Intellisense a bunch.

like image 62
Benjamin Anderson Avatar answered Nov 01 '22 09:11

Benjamin Anderson


I came across this when changing the base type of my razor views in the web.config of the view folder.

I correctly changed this section

  <system.web.webPages.razor>
    <pages pageBaseType="My.CustomType">
  </system.web.webPages.razor>

I then incorrectly changed the <system.web> section to also include my custom type. I had to change this back to the fully qualified System.Web.Mvc.ViewPage, something like;

<system.web>
    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    </pages>
</system.web>

After cleaning and rebuilding the project all of the type argument errors were gone and I was still using my custom type for razor views as defined in <system.web.webPages.razor>

like image 39
Red Taz Avatar answered Nov 01 '22 10:11

Red Taz