2013-12-11 22 views
1

UPDATE 好吧,我有一點,我在錯誤的方向=移動),所以,這個想法:如何進入Action並根據MVC中的按鈕點擊傳遞參數?

我有一個表,我的網頁上(View = Index.cshtml):

<tbody id="SessionListBody"> 

<tr style="display: none;"> … </tr> 
<tr> 
    <td id="2" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/Home/MattersSession/2"> … </a> 
    </td> 
</tr> 
<tr> 
    <td id="3" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/Home/MattersSession/3"> … </a> 
    </td> 
</tr> 
<tr> 
    <td id="4" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/Home/MattersSession/4"> … </a> 
    </td> 
</tr> 
<tr> 
    <td id="5" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/Home/MattersSession/5"> … </a> 
    </td> 
</tr> 
<tr> 
    <td id="6" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/Home/MattersSession/6"> … </a> 
    </td> 
</tr> 

每一行都包含按鈕。我需要得到該行的第一tdid被點擊按鈕時,並通過這個id到我的行動:

public ActionResult MattersSession(int sessionPageID) 
     { 
      DBAccess dba = new DBAccess(); 
      DataTable dt = dba.GetSessionPage(sessionPageID); 
      Session["SourceFileID"] = dt.Rows[0]["SourceFileID"]; 
      Session["SessionPageID"] = sessionPageID; 

      // Generate Table and pass it to the View 
      ViewData["MattersTable"] = dt.Rows[0]["MainTableBody"]; 
      ViewData["SummaryTable"] = dt.Rows[0]["SummaryBody"]; 

      return View("Matters"); 
     } 

現在,當我點擊我得到這個錯誤鏈接:

The parameters dictionary contains a null entry for parameter 'sessionPageID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult MattersSession(Int32)' in 'QuickbookUploadFromElite3e.Controllers.HomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
Parameter name: parameters 

但我需要這個參數來調用這個方法DataTable dt = dba.GetSessionPage(sessionPageID);,所以如果我會做這個參數可選,這將是comile錯誤?

+0

嘗試添加一個參數給你的錯誤函數'error:function(e){'並提醒'e.message'? – brandonscript

+0

是你的控制器被擊中的方法,並被填充的ID? –

+1

您需要將'dataType:json'更改爲'dataType:html' – PSL

回答

2

我打算在我的答案中做一些假設。請讓我知道,如果這些假設是不正確的,我會調整我的回答:

  1. 您正在使用引導
  2. 這些按鈕會加載一個新的頁面(本質上是一個GET請求)
  3. 您是從一個強類型的(IEnumerable的)查看 使你行你使用的ViewData

如果所有這些假設都是真實的,我會用一個錨鏈接解決這個問題,只是給它一個按鈕的外觀。使用視圖的模型來獲取每個項目的ID。

@foreach(var item in ViewData["MattersTable"]){ 
<tr> 
    <td id="@item.Id" class="date"> … </td> 
    <td> … </td> 
    <td> 
     <a class="btn btn-primary btn-sm" href="/myController/MattersSession/@item.Id"> "Button" Text </a> 
    </td> 
</tr> 
} 

而且,你所得到的空參數錯誤,因爲你的路由可能設立類似{controller}/{action}/{id}則認爲,在第3段任何事情都會通過一個名爲id參數的約束,但你命名你的參數你的行動方法SessionPageId所以它找不到綁定。

+0

我完全同意這一點!爲了這個目的,爲什麼要使用按鈕?並使用引導類它看起來就像按鈕... – JOBG

+0

請參閱我的編輯。你幾乎是正確的,除非它不是一個強類型(IEnumerable)視圖 – Bryuk

+1

你已經有了url參數所需的信息,但是你需要把參數名從'sessionPageID'改成'id',默認路由是參數名稱將是'id'。 – JOBG

0

我沒有看到你的動作方法屬性,但我可以猜測這是因爲缺少[HttpPost]。嘗試用這種方式修改您的代碼:

[HttpPost] 
public ActionResult MattersSession(int sessionPageID) 
{ 
    return View("Matters"); 
} 

另一個原因:您可能具有[ValidateAntiforgetyToken]屬性。如果是這樣,它將無法正常工作,因爲您沒有將防僞標記與ajax一起傳遞。

+1

'HttpPost'屬性不允許發佈請求,它_restricts_發佈請求。發佈到沒有任何http方法限制的操作可以正常工作。 –

+0

[HttpPost]不會改變任何內容。正如我所說,我會採取行動,但不是渲染「事項」的看法,我在ajax返回錯誤 – Bryuk

+0

@Bryuk您的觀點返回HTML而不是JSON(我相信這通常是這種情況)。所以你需要將dataType改爲html。另外,看看你是否也在自己的行動中獲得了它。查看你的網絡控制檯會給你更多關於這個問題的細節。 – PSL

相關問題