【问题标题】:Html.Actionlink passing null values to controllerHtml.Actionlink 将空值传递给控制器
【发布时间】:2012-07-11 15:33:07
【问题描述】:

我的控制器中有一个名为“DirectorySearchController”的方法

public ActionResult PersonDetails(FoundPerson person) //for some reason person is null here
{
    DirectoryViewModel viewModel = new DirectoryViewModel();
    viewModel.person = person;
    return View(viewModel);
}

当我使用 Html.Actionlink 从视图向它传递一些参数时,它返回一个空值

<ul data-role="listview">
    @if (ViewBag.Message == "NO RESULTS FOUND")
    {
        <li>@ViewBag.Message</li>
    }
    else
    {
            foreach (var employee in Model)
            {
                <li>
                    <div class="ui-grid-b">
                        <div class="ui-block-a" style="width:20%; vertical-align:middle"><img src="@employee.pictureURL" width="40px" height="40px"/></div>
                        <div class="ui-block-b" style="width:80%; vertical-align:middle">@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", new { person = employee}, null)</div>
                    </div>
                </li>
            }
    }


</ul>

但有趣的是,当我在不使用“new”关键字的情况下传递参数时,它传递了正确的值。但是,问题是我需要传递多个参数,所以我需要使用“new”关键字。

<div class="ui-block-b" style="width:80%; vertical-align:middle">@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", employee, null)</div>

【问题讨论】:

  • 我有完全相同的问题 - 如果我指定控制器方法所需的参数,它会抱怨 null 值,但如果我传递对象,它会神奇地选择正确的对象属性。疯了!

标签: asp.net-mvc parameters null actionlink


【解决方案1】:

我认为您没有使用正确的 ActionLink 重载。尝试其中任何一个

第一个应该主要根据您的情况工作:

<%=Html.ActionLink(employee.Name, "PersonalDetails", "DirectorySearch", new { person = employee }, null)%>

<%=Html.ActionLink(employee.Name, "PersonalDetails", new {person = employee})%>

这里只是一个建议。理想情况下,我会使用输入提交将数据发布到控制器。您可以在控制器端使用 Model 类或 FormCollection 来检索您在视图中输入的值。

【讨论】:

  • 感谢 CodeMaid,我试过了,但它仍然不能与任何一个一起工作 两个问题:1)使用 语法与我上面的语法有区别吗? 2)我在这个视图上没有任何表单,我正在从另一个控制器方法将对象列表传递给视图。我还能用你的推荐吗?
【解决方案2】:

您不应将模型传递给控制器​​操作,例如 new { person = employee } in Html.ActionLink。因为发生的情况是,当您生成操作链接时,您传递的对象将转换为 RouteValueDictionary,该对象将传递给 UrlHelper 以将路由字典值附加到链接。

当您像第一种情况一样传递一个匿名对象时,RouteValueDictionary 存储一个名为 person 的单个参数并设置它看到您传递了一个对象的值,它无法序列化完整的实例并且将其设置为单个属性,因此它所做的只是将模型Employee 的类型名称设置为人员的值。因此,您将看到生成的链接为 http://someserver/DirectorySearch/PersonDetails?person=Models.Employee

如果您像在第二种情况下那样传递一个实例,那么它会迭代所有属性并创建键/值对,而键是属性名称,值是属性值,最后它们都附加到链接作为查询字符串。如果生成的 url 将是 http://someserver/DirectorySearch/PersonDetails?Property1=Value1&Property2=Value2

正确

@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", employee, null)

错误

@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", new {person = employee }, null)

您可以使用匿名对象将路由参数传递给操作链接,但此时您不应传递引用类型,而是传递整数、字符串等内置类型..

例如。

@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", 
new { Id = 23, Name = "Mark" }, null)

【讨论】:

  • 谢谢Mark,上面以正确的方式传递多个参数怎么样?
  • 当您传递匿名对象时,您将参数作为键/值对传递,类似于字典,因此您只会看到一个名为“person”的查询字符串参数,但是当您传递一个实例时,它们的所有属性都是转换为查询字符串参数,这就是模型绑定所需要的。
  • 再次感谢,听起来很无知,但是传递多个引用类型呢,例如在原始代码中传递员工和模型?
  • 我不明白为什么要为 GET 操作传递多个引用类型,通常应该使用 POST。但是您仍然可以通过第一种方式 new { person1 = employee1, person2 = employee2 }.
  • 大声笑,但这仍然导致我原来的难题,控制器将 person1 和 person2 识别为空对象。我需要通过一个员工(人),我需要通过整个员工列表(模型),但这就是我遇到困难的地方。
猜你喜欢
  • 2015-11-22
  • 2012-12-18
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多