2014-10-09 2 views
0

Получение ошибки после того, как данные обновления в базе данныхПолучение ошибки Необязательный параметр должен быть ссылочного типа обнуляемым типа или быть объявлена ​​в качестве необязательного параметра

Словарь параметров содержит пустую запись для параметра «ид» из non-nullable type 'System.Int32' для метода 'System.Web.Mvc.ActionResult UpdateChain (Int32, HCIBE.Models.chain)' в 'HCIBE.Controllers.ChainsController'. Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр.

Вот мой контроллер

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

Посмотреть

@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> 

Через Выбор Dropdown я Заполните все текстовые поля, когда я отправить форму, то я получаю ошибку.

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

Модель

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

Уход, чтобы показать свои маршруты? Я считаю, что это проблема. Для маршрута по умолчанию требуется идентификатор. – Origin

+0

Вы либо пропустили какой-то код, либо не очень-то здесь. Почему вы используете AJAX для публикации, а также для отправки формы одновременно (вы делаете 2 вызова - один передаёт значение id (AJAX), которое ничего не делает, а другое передающее «цепочку» (SUBMIT) без 'id' –

+0

У меня есть не слишком много идей о MVC, может быть, мой способ работы неправильный, поэтому PLZ.Позвольте мне исправить это. Спасибо – Anjyr

ответ

1

Вы пропускании object из chain, но вы не добавили значение id в нем в любом месте. Вам необходимо установить value из id и добавить его в chain object.

+0

Как id, я просматриваю dropdown selectedvalue, так как я передаю свое выпадающее значение там. @ Url.Action («UpdateChain», «Chains», new {id = ** DropdownValue **}) Я не знаю. – Anjyr

+0

Измените эту строку @ Url.Action («UpdateChain», «Chains») на @ Url.Action («UpdateChain», «Chains», new {id = _vddlChainID}) – Mairaj

+0

он не работает ... Имя '_vddlChainID' не существует в текущем контексте. – Anjyr

0

Ваш идентификатор пуст, когда вы отправляете форму, поэтому вы получаете эту ошибку.

Либо указать на Nullable идентификатор параметра, как вы сделали в методе GET или

магазин идентификатор в скрытом поле, чтобы передать его автоматически с моделью, как этот

@HTML.HiddenFor(Model.id) 

или передать его начинающийся вручную

@HTML.Hidden("id",id) 
+0

Я не знаю, как передать выпадающее выбранное значение в любое скрытое поле или где угодно. – Anjyr

+0

вы можете напрямую передать его методу, подобному этому 'string ddlchainname', где string - это тип значения, передаваемого dropdown. Ddlchainname - это имя выпадающего списка – Twix

Смежные вопросы