12

ASP.NET MVC3 で新しい WebGrid を使用しようとしています。また、さまざまなアクション (編集、表示、削除) を実行するリンク アイコンのセットを表示したい列の 1 つを使用しようとしています。次の HTML を出力します。

<a href="" title=""><img alt="" src="" /></a>

拡張機能は MvcHtmlString を返し、Razor ビューで単独で使用すると正常に動作します。例: @Html.ActionLinkIconForEditAction("Customer", 2)

問題は、オブジェクトの ID を渡すときに、WebGrid 列でこのヘルパーを (アクションごとに 1 回) 呼び出す必要があることです。私が困惑している問題は、コンパイラが MvcHtmlString (または、呼び出しに応じて「ラムダ式」) をフォーマットで期待される System.Func に変換できないというエラーを表示することです...

たとえば、これは機能します。

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", 2)</text>)

しかし、これはしません:

grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", customer.Id)</text>)
grid.Column(header: "", format: (customer) => Html.ActionLinkIconForEditAction("Customer", customer.Id))

私は得る:

Error 4 Argument 3: cannot convert from 'lambda expression' to 'System.Func<dynamic,object>'

またはこの呼び出しの場合:

grid.Column(header: "", format: Html.ActionLinkIconForEditAction("Customer", customer.Id)),

私は得る:

Error 5 Argument 3: cannot convert from 'System.Web.Mvc.MvcHtmlString' to 'System.Func<dynamic,object>'

奇妙なことに、ラムダ、直接 Model.Property アクセサー、さらには String.Format("") からの出力を使用する他の列があります...それらはすべて正常に動作します... Func とこのスレッドのすべてのドキュメントも読みました、そしてまだそれを完全に理解することはできません:)

誰かが私が間違っていることを見つけることができますか?

4

3 に答える 3

15

私はそれを手に入れました:) ....問題は、C#が動的オブジェクトを処理する方法にあるようです...多くのユーザーがこれで爆発しています...

修正は、パラメーターの正しい型を拡張ヘルパーにキャストするのと同じくらい簡単でした...したがって、これは機能します:

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", (int)item.Id)

もう 1 つのトリックは、"item" オブジェクトで "built" を使用し、独自のものを提供しないことです。たとえば、これは機能しません。

grid.Column(header: "", format: (customer) =>  @<text>@Html.ActionLinkIconForEditAction("Customer", (int)customer.Id)

多くの読み取り、微調整、学習...うまくいけば、次のバージョンでは、モデルから直接来ていない列にコンテンツを追加する必要がある場合に、はるかに使いやすいものになります...

よろしくZ...

于 2011-02-25T23:17:19.760 に答える
1
grid.Column(format: (item) => Html.ActionLink("EditCustomer","Editcustomer", new {CustomerId=item.CustomerId}))

これは機能し、上記のものも機能します..ここで、最初の「EditCustomer」はユーザーに表示されるテキストであり、2番目の「EditCustomer」はリダイレクトするアクションの名前であり、アイテムは

于 2012-07-25T11:12:31.717 に答える
1

C# コードで作成する必要がありWebGrid、ハイパーリンクを使用して特定の列を表示する必要がありました。上記のテクニックはどれも私にとってはうまくいきませんでした。そこで、MvcHtmlString.createの戻り値を使用して渡しましたString.format


  format: (item) => MvcHtmlString.Create(string.Format((A HREF=\"/Inventory/EditInventory/{0}\"){1}(/A)", item.ID, item.Property))) 

文字列内の ( または ) をそれぞれ < または > に置き換えます。

于 2012-09-03T12:45:04.277 に答える