web-dev-qa-db-fra.com

MVC: le dictionnaire de paramètres contient une entrée NULL pour le paramètre 'k' de type non nullable 'System.Int32'

Je suis nouveau à MVC. Dans mon application, je récupère les données de Mydatabase. mais quand je lance mon application, il affiche une erreur comme celle-ci. 

http://localhost:7317/Employee/DetailsData/4



  Exception Details: System.ArgumentException: The parameters dictionary contains a null entry for parameter 'k' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult DetailsData(Int32)' in 'MVCViewDemo.Controllers.EmployeeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

c'est mon code de fichier web.config

<connectionStrings>
  <add name="EmployeeContext" connectionString="Server=.;Database=mytry;integrated security=true; ProviderName=System.Data.SqlClient"/>
</connectionStrings>

c'est ma classe de modèle d'employé (Employee.cs)

[Table("emp")]    /* to map tablename with our class name*/
    public class Employee
    {
        public int EmpId { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string City { get; set; }

    }

Ma classe de modèle EmployeeContext.cs

 public class EmployeeContext:DbContext
    {
        public DbSet<Employee> Employees { get; set; }
    }

mon EmployeeController.cs

 public ActionResult DetailsData(int k)
        {

            EmployeeContext Ec = new EmployeeContext();
            Employee emp = Ec.Employees.Single(X => X.EmpId == k);           
            return View(emp);
        }

et ma vue 

<h2>DetailsData</h2>
@Model.Name<br />
@Model.City<br />
@Model.Gender<br />
@Model.EmpId
41
Amit Kumar

Il semble que vous utilisiez la route par défaut, définie comme suit:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

La partie clé de cette route est la pièce {id}. Si vous examinez votre méthode d'action, votre paramètre est k au lieu de id. Vous devez modifier votre méthode d'action en cette méthode afin qu'elle corresponde au paramètre route:

// change int k to int id
public ActionResult DetailsData(int id)

Si vous voulez laisser votre paramètre égal à k, vous devez alors modifier l'URL comme suit:

http://localhost:7317/Employee/DetailsData?k=4

Vous semblez également avoir un problème avec votre chaîne de connexion. Dans votre web.config, vous devez changer votre chaîne de connexion en ceci (fourni par haim770 dans une autre réponse qu'il a supprimée):

<connectionStrings>
  <add name="EmployeeContext"
       connectionString="Server=.;Database=mytry;integrated security=True;"
       providerName="System.Data.SqlClient" />
</connectionStrings>
73
Dismissile

Il semble que votre action ait besoin de k mais ModelBinder ne peut pas la trouver (dans un formulaire, ou demander ou afficher des données ou ..).

public ActionResult DetailsData(int? k)
    {

        EmployeeContext Ec = new EmployeeContext();
        if (k != null)
        {
           Employee emp = Ec.Employees.Single(X => X.EmpId == k.Value);

           return View(emp);
        }
        return View();
    }
5
RezaRahmati

J'ai fait face à cette erreur parce que j'ai envoyé la chaîne de requête avec un format incorrect

http://localhost:56110/user/updateuserinfo?Id=55?Name=Basheer&Phone=(111)%20111-1111
------------------------------------------^----(^)-----------^---...
--------------------------------------------must be &

alors assurez-vous que votre Query String ou paramètre passé dans le format right format

1
Basheer AL-MOMANI

Je suis également nouveau dans MVC et j’ai reçu la même erreur et j’ai constaté qu’il ne transmettait pas routeValues dans la vue Index ou toute autre vue présente pour afficher toutes les données.

C'était comme ci-dessous  

<td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>

Je l'ai changé comme indiqué ci-dessous et j'ai commencé à fonctionner correctement.

<td>
            @Html.ActionLink("Edit", "Edit", new { EmployeeID=item.EmployeeID }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>

Fondamentalement, cette erreur peut aussi être due à une navigation incorrecte.

0
Manoj Naik