简体   繁体   中英

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; }
}

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 .

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM