ASPXで動作するMVC contrib gridカスタム列を取得する方法
-
13-12-2019 - |
質問
データグリッドのレンダリング、ソート、フィルタリングにMVC Contribグリッドを使用していますが、MVC3とRazor用にアップグレードされたため、問題が発生しています。私のcolumnsコレクションのカスタムメソッドはaspxページでは機能せず、columnsアクションメソッドは廃止されました。
私はMVC2でこのような私の列をレンダリングするためにグリッドアクションメソッドを使用しています:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
column.For("View User").Named("Tools").Action(x => { %>
<td>
<%= Html.ActionLink("View", "View", new { id = p.Id })%>
<%= Html.ActionLink("Edit ", "Edit", new { id = p.Id })%>
//Snip as there are too many tools :-)
//.....
<%= Html.ActionLink("Delete", "Delete", new { id = p.Id })%>
</td>
<% });
...
最新バージョンでは、廃止されたアクションメソッドを置き換えるカスタムメソッドがあります。私はそれがどのように行うことができるかを見ました ここでは, 、これは基本的に私のために今動作しますが、私はaspxビュー(urlなど)ですべてのヘルパーを失い、以下のように私のモデルの別のメソッドで私の内容をレ:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
//the new custom column
column.Custom(Model.ToolsRenderer);
<% });
...
以下のtoolsrendererと呼ばれるグリッドモデルメソッドは、html文字列をレンダリングするために使用されます。
public UserManagementViewModel : BaseModel {
//..snip
//
public object ToolsRenderer(Client client)
{
List<string> links = new List<string>();
var editLink = new TagBuilder("a");
// here is my biggest problem, before Html.ActionLink used to make
// sure that I don't have any missing links or help me if i need to
// refactor an action / controller name :-(
editLink.Attributes["href"] = GetEditUserLink(client, HttpContext.Current.Request.Url.AbsoluteUri);
editLink.SetInnerText("edit");
links.Add(editLink.ToString());
...
...lots of links to be generated here
...
return MvcHtmlString.Create(string.join(" |", links))
}
//..snip
}
これは今のところ機能しますが、aspxページを以下のようなrazorビューのように機能させる方法はありますか?
@Html.Grid(Model).Columns(column =>
{
column.For(x => x.Id).
column.For(x => x.Name);
column.Custom(@<td><a href='@Html.Actionlink("edit","user",new {id})' alt="@item.email"/><a></td>)
})
私は次のようなことを言いたい:
...
column.Custom(%><td><a href='<%=Html.Actionlink("edit","user",new {id})%>' alt="<%=item.email%>"/><a></td><%)
...
解決
最終的に、いくつかのヘルプと掘削を伴う作業を見つけることができ、カスタム列を使用する代わりに、列を使用してhtml.partialを押し込みます。以下のコードのようなもの。
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
// could use RenderPartial() to
column.For(x =>Html.Partial("UserActionColumn", x));
<% });
. 他のヒント
カスタムフィールドにはhelperを使用できます。
例えば:
column.For(r => Status(r.Status)).Encode(false).Named("Status");
@helper Status(string value)
{
if (value == RequestStatus.Pending)
{
<span class="label label-info">@value</span>
}
...
}
. 他の答えを補完するために、そのカスタム列でソートしたい場合は、追加することを忘れないでください SortColumnName
.これを行わないと、グリッドは Named
列名として引数を指定しますが、 Named
列にタイトルを付けるためにも使用されます。列名がタイトルと一致しなかったため、頭痛がしました:
column.For(c => "custom text").Named("Column Name").SortColumnName("ColumnName");