如何进入Action并根据MVC中的按钮单击传递参数?

时间:2013-12-11 21:30:49

标签: javascript jquery ajax asp.net-mvc asp.net-mvc-4

更新 好吧,我明白我向错误的方向移动=)所以,理念:

我的页面上有一个表格(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>

每行包含按钮。我需要在点击按钮时获取行的第一个id的{​​{1}}并将此td传递给我的操作:

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 ,所以如果我这样做param可选,那将是comile错误吗?

2 个答案:

答案 0 :(得分:2)

我将在答案中做出一些假设。如果任何这些假设不正确,请告诉我,我会调整我的答案:

  1. 您正在使用Bootstrap
  2. 这些按钮将加载新页面(实质上是GET请求)
  3. 您正在从强类型(IEnumerable)视图中创建行您使用ViewData
  4. 如果所有这些假设都是真的,我会通过使用锚链接解决它,并给它一个按钮的外观。使用View的模型获取每个项目的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>
    }
    

    此外,您将获得null参数错误,因为您的路由可能设置为{controller}/{action}/{id},因此它假定第3段中的任何内容都将被名为id的参数绑定,但您有在操作方法SessionPageId中命名了您的参数,因此无法找到绑定。

答案 1 :(得分:0)

我没有看到你的动作方法属性,但我猜它是因为缺少[HttpPost]。尝试以这种方式修改您的代码:

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

另一个原因:您可能具有[ValidateAntiforgetyToken]属性。如果是这样,它将无效,因为您没有使用ajax传递防伪令牌。