ANJYR
ANJYR

Reputation: 2623

Getting Error An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter

Getting Error after Update data into database

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult UpdateChain(Int32, HCIBE.Models.chain)' in 'HCIBE.Controllers.ChainsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

Here is My Controller

    [HttpGet]
    public ActionResult UpdateChain(int? id)
    {
        chain objchain = db.chains.Find(id);
        if (objchain == null)
        {
            return HttpNotFound();
        }
        return View(objchain);
    }

    [HttpPost]
    public ActionResult UpdateChain(int id, [Bind(Include = "name,code,username,password,updated_by,updated_on")] chain chain)
    {
        chain _objchain = db.chains.Find(id);
        try
        {
        if(ModelState.IsValid)
        {
            _objchain.code = chain.code;
            _objchain.name = chain.name;
            _objchain.username = chain.username;
            _objchain.password = chain.password;
            _objchain.updated_by = Convert.ToInt32("1");
            _objchain.updated_on = DateTime.Now;

            db.Entry(_objchain).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        }
        catch (Exception Ex)
        {
            ModelState.AddModelError("", "Unable to update data");
        }
        return View(_objchain);
    }

View

@using (@Html.BeginForm("UpdateChain", "Chains", FormMethod.Post))
{

<div class="form-horizontal">
    <hr />
    <div class="form-group">
        <label class="col-sm-2 control-label">
            Select Chain
        </label>
        <div class="col-md-3">
            @Html.DropDownList("ddlchainname", (SelectList)ViewData["chain_name"],"Select Chain", new { onchange = "Action(this.value);", @class = "form-control" })
        </div>
        <label class="control-label">
            or @Html.ActionLink("Add New", "Create")

        </label>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">
            Chain Name
        </label>
        <div class="col-md-3">
            @Html.TextBox("ChainName", null, new { @class = "form-control" })
        </div>
        <label class="col-sm-2 control-label">
            Username
        </label>
        <div class="col-md-3">
            @Html.TextBox("username", null, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">
            Chain Code
        </label>
        <div class="col-md-3">
            @Html.TextBox("ChainCode", null, new { @class = "form-control" })
        </div>
        <label class="col-sm-2 control-label">
            Password
        </label>
        <div class="col-md-3">
            @Html.Password("password", null, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Update" onclick="UpdateChain()" class="btn btn-default" />
        </div>
    </div>
</div>
}

<script type="text/javascript">
    function UpdateChain(){
        var _vddlChainID = $("#ddlchainname").val();
        alert("Your Selected ID = " + _vddlChainID);
        $.ajax({
            url: '@Url.Action("UpdateChain", "Chains")',
            type: "POST",
            data: { "id": _vddlChainID }
        });
    }
</script>

Through Dropdown Selection i Fill all textboxes, when i submit form then i get Error.

Routing

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

Model

public partial class chain
{
    public chain()
    {
        this.templates = new HashSet<template>();
        this.hotels = new HashSet<hotel>();
    }

    public long chain_id { get; set; }
    public string name { get; set; }
    public string code { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public long created_by { get; set; }
    public System.DateTime created_on { get; set; }
    public Nullable<long> updated_by { get; set; }
    public Nullable<System.DateTime> updated_on { get; set; }

    public virtual ICollection<template> templates { get; set; }
    public virtual ICollection<hotel> hotels { get; set; }
}

Upvotes: 0

Views: 20897

Answers (2)

Mairaj Ahmad
Mairaj Ahmad

Reputation: 14604

You are passing an object of chain but you have not added value of id in it anywhere. You need to set value of id and add it in chain object.

Upvotes: 1

Twix
Twix

Reputation: 392

Your id is null when you submit the form that's why you are getting this error.

Either specify the the id parameter nullable as you have done in the get method or

store the id in a hidden field to pass it automatically with the model like this

@HTML.HiddenFor(Model.id)

or pass it manually

@HTML.Hidden("id",id)

Upvotes: 0

Related Questions