【问题标题】:Why I can't pass this object from a view to a controller method?为什么我不能将此对象从视图传递给控制器​​方法?
【发布时间】:2014-06-17 13:36:20
【问题描述】:

在一个视图中我有这样的东西:

<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.Idlong

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

所以这是我的 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() 控制器方法?

【问题讨论】:

  • 仅供参考-如果您逐字搜索该错误消息,您将直接从文档(以及各种博客/等)中获得此问题的答案。

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


【解决方案1】:

检查你的函数签名:

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

交换输入参数:

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

错误现在消失了。原因是所有没有获得默认值的参数currentFix)必须出现在所有获得默认值的参数long vulnId = 0)之前 p>

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

【讨论】:

    【解决方案2】:

    在您的操作链接中进行如下更改并将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>
    

    【讨论】:

    • 这不是对上述错误消息的回答。但仍然是一个很好的收获:)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多