2014-08-28 58 views
0

我正在開發一個MVC 4應用程序,並且我遇到了這個問題。參數字典中包含一個空條目,用於不可爲空的類型'System.Int32'的參數

我有一個名爲'FormaFarmaceutica'的實體,它只有一個描述字段。由於它只有一個字段,創建和編輯視圖使用ajax加載到模式窗口中。模式窗口在同一控制器的索引視圖中定義。

創建沒有問題,當我點擊'添加'按鈕時,模態窗口顯示,並且當我提交時,數據庫中的新條目出現。

在編輯操作中,當我點擊'編輯'按鈕時,模態窗口顯示,我想要編輯的值已經加載。但當我提交表格,我得到這個'參數字典包含一個空的條目參數的非空類型'System.Int32''錯誤。

下面的代碼:

編輯觀點:

@model Dominio.formafarmaceutica 

@using (Html.BeginForm("Edit", "FormaFarmaceutica", FormMethod.Post, new { id =  "add_form", role = "form" })) 
{ 
    @Html.ValidationSummary(true) 

<div class = "form-group"> 
    <input type="text" class="form-control" id="descripcion" name="descripcion" value="@Model.Descripcion" /> 
</div>        
<button type="submit" class="btn btn-primary">Guardar cambios</button> 

} 

模態窗口&腳本,這一觀點被加載:

<div class="modal fade" id="modalAgregar" tabindex="-1" role="dialog" aria- labelledby="agregar" aria-hidden="true"> 
<div class="modal-dialog"> 
    <div class="modal-content"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
      <h4 class="modal-title">Descripcion</h4> 
     </div> 
     <div class="modal-body" id="modal"> 

     </div> 
    </div> 
</div> 
</div> 

<script type="text/javascript" charset="utf-8"> 

    $(function (e) { 
    forma farmaceutica.$("#editarFormaFarmaceutica").click(function() { 
     var idForma = $(this).val(); 
     var load = "@Url.Action("Edit", "FormaFarmaceutica")" + "?id=" + idForma.toString(); 
     $("#modal").load(load); 
    }); 
    }); 
</script> 

控制器:

[HttpPost] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     if (Session["Username"] != null) 
     { 
      if (user.HasAccess((int)Session["UserID"], (int)Operaciones.FormaFarmaceutica.Editar)) 
      { 
       try 
       { 
        formafarmaceutica f = db.FindSingle<formafarmaceutica>(aux => aux.ID == id && aux.Activo == 1); 
        if (f != null) 
        { 
         f.Descripcion = collection["descripcion"]; 
         db.Update<formafarmaceutica>(f); 

         Logger.Log.Registrar((int)Operaciones.FormaFarmaceutica.Editar, (string)Session["Username"], f.Descripcion); 

         return RedirectToAction("Index", "FormaFarmaceutica"); 
        } 
        else 
        { 
         ViewBag.Errors = "Ocurrió un error al guardar los cambios."; 
         return RedirectToAction("Index", "FormaFarmaceutica"); 
        } 
       } 
       catch (Exception e) 
       { 
        ViewBag.Errors = "Ocurrió un error al guardar los cambios."; 
        Logger.Log.Error((int)Operaciones.FormaFarmaceutica.Editar, e.InnerException.Message); 
        return RedirectToAction("Index", "FormaFarmaceutica"); 
       } 

      } 
      else 
      { 
       return RedirectToAction("AccessDenied", "Error"); 
      } 
     } 
     else 
     { 
      return RedirectToAction("AccessDenied", "Error"); 
     } 
    } 

FIX:

表單中缺少一個id字段。我添加了一個帶有id的隱藏輸入。謝謝您的幫助!

@model Dominio.formafarmaceutica 

    @using (Html.BeginForm("Edit", "FormaFarmaceutica", FormMethod.Post, new { id = "add_form", role = "form" })) 
    { 
     @Html.ValidationSummary(true) 

     <div class = "form-group"> 
      <input type="hidden" class="form-control" id="id" name="id" value="@Model.ID" /> 
      <input type="text" class="form-control" id="descripcion" name="descripcion" value="@Model.Descripcion" /> 
     </div>        
     <button type="submit" class="btn btn-primary">Guardar cambios</button> 

    } 
+0

在發佈到服務器之前,您是否檢查過什麼idForma(var idForma = $(this).val();)? – 2014-08-28 13:31:17

+0

是的,這是用來加載編輯視圖,工作正常。提交表單是問題。 – diebarral 2014-08-28 13:32:55

+0

看到下面的答案 – 2014-08-28 13:34:28

回答

2

您的編輯後的動作定義爲:

public ActionResult Edit(int id, FormCollection collection)

然而,有沒有在你的形式在你編輯視圖,它可以綁定到id參數。

+0

謝謝!在編輯視圖中,我添加了一個隱藏的輸入,其id爲值,並且它工作正常! diebarral 2014-08-28 13:46:19

+0

你也可以這樣做:@ Html.HiddenFor(x => x.ID)' – 2014-08-28 13:59:06

0

由於jQuery.load是get方法,你需要HttpMethod改變你的行動HttpGet。這可能會解決問題。

0

好吧......

您正在使用JQuery.load(...)... http://api.jquery.com/load/,有效地執行get請求,但行動是一個POST操作

要麼使用jQuery的POST請求或者將該操作標記爲[HttpGet]。事實上,你也期待一個FormCollection表明你想做一個職位,它應該是一個jQuery職位。 http://api.jquery.com/jquery.post/

+0

我認爲jquery加載調用一個get方法,他沒有顯示,返回的視圖,然後允許提交的形式(頂部標題編輯視圖),這反過來應該擊中控制器的行動。 – 2014-08-28 13:36:23

+0

@BenRobinson你可能是對的,但不清楚代碼示例的意圖是什麼 – 2014-08-28 13:37:45

+0

我同意這很混亂,但我認爲我設法解決了這個問題,主要是受過教育的猜測;-) – 2014-08-28 13:39:17

相關問題