为什么我无法将此对象从视图传递到控制器方法?

时间:2014-06-17 13:36:21

标签: c# jquery asp.net .net asp.net-mvc

在视图中我有这样的事情:

<ul data-role="listview" data-inset="true" data-theme="b" data-split-icon="delete">
            @foreach (DataModel.Vulnerability.Fix item in Model.VulnerabilityFixes)
            {


                <li><a href="@Url.Action("Details", "Product", new { Title = item.Title })">
                    <h2>@item.Title</h2>
                    <table style="width: 100%">
                        <tr>
                            <th>Id</th>
                            <th>FixName</th>
                            <th>Vendor</th>
                            <th>Version</th>
                        </tr>
                        <tr>
                            <td>@MyHelper.decodeNull(item.Id)</td>
                            <td>@MyHelper.decodeNull(item.FixName)</td>
                            <td>@MyHelper.decodeNull(item.Vendor)</td>
                            <td>@MyHelper.decodeNull(item.Version)</td>
                        </tr>
                    </table>

                </a>
                    <a href="@Url.Action("DeleteFix", "Editing", new { vulnId = Model.Id, fix = item })">Delete</a>

                </li>
            }
    </ul>

正如您所看到的,它显示了一个表,此表有一个删除按钮,单击在 EditingController 类上调用 DeleteFix()方法,此方法采用2个参数那是:

  1. vulnId = Model.Id

  2. 当前项目是 DataModel.Vulnerability.Fix 对象。

  3. 所以这是 DeleteFix()的代码定义到我的 EditingController 类:

        public ActionResult DeleteFix(long vulnId = 0, DataModel.Vulnerability.Fix currentFix) 
        {
    
            DataModel.Vulnerability.Fix model = new DataModel.Vulnerability.Fix();
    
            manager.openConnection();
    
            try
            {
                model = currentFix;
            }
            finally
            {
                manager.closeConnection();
            }
    
            return View(model);
    }
    

    问题是,在此方法的签名上给出以下错误,引用第二个输入参数( DataModel.Vulnerability.Fix 对象)。它告诉我:

      

    错误14必要后,必须显示可选参数   参数C:\ Develop \ EarlyWarning \ public \ Implementazione \ Ver2 \ WebPortal \ WebPortal \ Controllers \ EditingController.cs 27 94 WebPortal

    为什么呢?我错过了什么?如何将以前的 DataModel.Vulnerability.Fix 项目对象从我的视图传递到 DeleteFix()控制器方法?

3 个答案:

答案 0 :(得分:4)

检查您的功能签名:

public ActionResult DeleteFix(long vulnId = 0, DataModel.Vulnerability.Fix currentFix) 

交换输入参数:

public ActionResult DeleteFix(DataModel.Vulnerability.Fix currentFix, long vulnId = 0) 

错误现在消失了。原因是所有未获得默认值的参数 currentFix)必须出现在所有获取默认值的参数之前({{1} })

<强>更新
@ Neel的回答也是正确的,但与你提到的错误无关  它不是错误的原因,但它也需要修复。假设这不是SO问题中的拼写错误:)

答案 1 :(得分:2)

在您的actionlink中进行如下更改,并将currentFix代替fix并更改顺序如下: -

(建议更平坦)

public ActionResult DeleteFix(DataModel.Vulnerability.Fix currentFix, long vulnId = 0) 

并在视野中

<a href="@Url.Action("DeleteFix", "Editing", new {  currentFix = item, vulnId = Model.Id, })">Delete</a>

答案 2 :(得分:2)

在C#中,您无法在非可选参数之前声明可选参数。 将您的控制器操作更改为:

public ActionResult DeleteFix(DataModel.Vulnerability.Fix currentFix, long vulnId = 0)