我的控制器中有这个方法叫做“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>
答案 0 :(得分:1)
我认为你没有使用ActionLink的正确重载。尝试使用其中任何一个
第一个应该根据你的情况主要工作:
<%=Html.ActionLink(employee.Name, "PersonalDetails", "DirectorySearch", new { person = employee }, null)%>
<%=Html.ActionLink(employee.Name, "PersonalDetails", new {person = employee})%>
这里只是推荐。理想情况下,我会使用输入提交将数据发布到Controller。您可以在控制器端使用Model类或FormCollection来检索您在视图中输入的值。
答案 1 :(得分:0)
您不应该将模型传递给控制器操作,例如new { person = employee }
中的Html.ActionLink
。因为发生的情况是,当您生成操作链接时,您传递的对象将转换为RouteValueDictionary
,并将其传递给UrlHelper
以将路线字典值附加到链接。
当你像第一种情况一样传递一个匿名对象时,RouteValueDictionary
存储一个名为person
的参数,并设置它看到你传递一个对象的值,它无法序列化完整实例并将其设置为单个属性,因此它所做的就是将模型Employee
的类型名称设置为人员的值。因此,您将看到生成的链接为 http:// someserver / DirectorySearch / PersonDetails?person = Models.Employee
如果你像第二种情况那样传递一个实例,那么它会迭代所有属性并创建键/值对,而键是属性名称,值是属性值,最后它们都附加到链接作为查询字符串。如果生成的URL将是 http:// someserver / DirectorySearch / PersonDetails?Property1 = Value1&amp; 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)