Reputation: 2623
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
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
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