1

「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 を使用してビューからいくつかのパラメーターを渡すと、null 値が返されます

<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>
4

2 に答える 2

2

ActionLink の正しいオーバーロードを使用していないと思います。これらのいずれかで試してください

最初のものは、ほとんどの場合、あなたのケースに応じて動作するはずです:

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

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

おすすめはここだけ。理想的には、入力送信を使用してデータをコントローラーに投稿します。ビューに入力した値を取得するには、コントローラ側で Model クラスまたは FormCollection を使用できます。

于 2012-07-11T16:08:41.333 に答える
1

new { person = employee }のようにモデルをコントローラーアクションに渡さないでくださいHtml.ActionLink。何が起こるかというと、アクションリンクを生成すると、渡したオブジェクトが変換され、ルートディクショナリの値をリンクに追加するためにRouteValueDictionaryに渡されます。UrlHelper

最初のケースのように匿名オブジェクトを渡すと、RouteValueDictionaryは名前付きの単一のパラメーターを格納personし、オブジェクトを渡したことがわかる値を設定するために、インスタンス全体をシリアル化して単一のプロパティに設定することはできないため、すべてモデルのタイプ名をEmployee人への値として設定します。したがって、生成されたリンクはhttp:// someserver / DirectorySearch / PersonDetails?person=Models.Employeeとして表示されます。

2番目のケースのようにインスタンスを渡すと、すべてのプロパティが繰り返され、キーと値のペアが作成されます。キーはプロパティ名であり、値はプロパティ値であり、最後にすべてクエリ文字列としてリンクに追加されます。この場合、生成される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)
于 2012-07-11T16:14:39.253 に答える