1
@{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No").Filterable(true);
})

しかし、私はそのようなことをしたい:

@if(some conditon)
{
@{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
}
else
{
@{IEnumerable<BC.Models.RIGHTS> data = ViewBag.list;} 
}
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})

しかし、それは機能していません。
今、私がこのようなことをするとうまくいきます

@if(some conditon)
    {
    @{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })
    }
    else
    {
    @{IEnumerable<BC.Models.RIGHTS> data = ViewBag.list;} 
    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })
    }

私の問題は、両方の Model クラスに APPLICATION_NO プロパティが存在するため、使用したくないことです

    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })

私のコードで2回。

4

3 に答える 3

3
@if(some conditon)
{
@{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
}
else
{
@{IEnumerable<BC.Models.RIGHTS> data = ViewBag.list;} 
}
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})

データが if ブロックに宣言されているため、コードは機能しません。グリッドが 2 つのクラスの共有フィールドでのみ動作する必要がある場合は、APPLICATION と RIGHTS が実装するインターフェイスを使用して、次のようにコードを変更することを検討できます。

@{IEnumerable<BC.Models.IAPPLICATION_NO> data = (IEnumerable<BC.Models.IAPPLICATION_NO>)ViewBag.list;} 
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})

ここで、IAPPLICATION_NO は次のようなインターフェイスです。

public interface IAPPLICATION_NO
{
    string APPLICATION_NO { get; }
}

APPLICATION_NO が何かわからないので、文字列を使用し、インターフェイスはグリッドに対してのみ定義できます。

それ以外の場合、これら 2 つのタイプの異なるデータを表示する必要がある場合は、if ブロックで 2 つのビューまたは異なるグリッド宣言を使用することを検討する必要があります。

私はVSで私の答えのサンプルに取り組みました:

コードを添付します:

public interface AInterface
{
    string AProperty { get; }
}

public class AList : AInterface
{
    public string AProperty { get; set; }
}

public class BList : AInterface
{
    public string AProperty { get; set; }
}

これらはクラスです

今コントローラー:

public class TestController : Controller
{
    public ActionResult Index()
    {
        var random = new Random((int)DateTime.Now.Ticks);

        if (random.Next() % 2 == 0)
            ViewBag.List = new List<AList> { new AList { AProperty = "Atestvalue" } };
        else
            ViewBag.List = new List<BList> { new BList { AProperty = "Atestvalue" } };

        return View();
    }
}

とビュー:

@{
    ViewBag.Title = "Index";
    IEnumerable<TestMvcApplication.Interfaces.AInterface> test = ViewBag.List;
}

<h2>Index</h2>

@foreach (var item in test)
{
    <div>
        @item.AProperty
    </div>
}

ご覧のとおり、これで問題が解決します

インターフェイスを使用しない場合:

@{IEnumerable<dynamic> data = (IEnumerable<dynamic>)ViewBag.list;} 
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})

しかし、IntelliSense の完了が失われ、メンバーが欠落している場合は、ランタイム エラーが発生すると思います。

Grid アセンブリを試しましたが、C# Expression を使用しており、動的と互換性がありません。別の解決策は、コントローラーで LINQ を使用して、あるリストを別のリストにキャストすることです。

IEnumerable<BC.Models.Application> data;
if (some condition)
{
    data = applicationList; //applicationList's type is IEnumerable<BC.Models.Application>
}
else
{
    data = rightsList.Select(t => new Application { APPLICATION_NO = t.APPLICATION_NO }); //rightsList's type is IEnumerable<BC.Models.RIGHTS>
}

ViewBag.list = data;

ビューでは、質問の上部に投稿した作業コードを保持できます。使用する型は 1 つだけですが、これらのクラス間で共通のインターフェイスを使用しないため、マルチタイプ IEnumerable のサポートはありません。リフレクションに移行する必要があると思いますが、そのコードを記述するのは難しいと思います。

于 2014-06-27T09:46:07.377 に答える