2

警告: これは C# の dynamic キーワードの不適切な使用である可能性があり、おそらく厳密に型指定されたビュー モデルを使用する必要がありますが...

ビューに C# 4 動的型を渡すことで、厳密に型指定されたビュー モデルの作成を回避しようとしています。コントローラーにこれがあります:

    public ActionResult Index()
    {
        var query =
            from fr in db.ForecastRates
            join c in db.Codes
            on 
                new { Code = fr.RateCode, CodeType = "ForecastRate" }
            equals 
                new { Code = c.CodeValue, CodeType = c.CodeType }
            select new
            {
                RateCode = fr.RateCode,
                RateCodeName = c.CodeName,
                Year = fr.Year,
                Rate = fr.Rate,
                Comment = fr.Comment
            };

        // Create a list of dynamic objects to form the view model
        // that has prettified rate code
        var forecastRates = new List<dynamic>();

        foreach (var fr in query)
        {
            dynamic f = new ExpandoObject();

            f.RateCode = fr.RateCode;
            f.RateCodeName = fr.RateCodeName;
            f.Year = fr.Year;
            f.Rate = fr.Rate;
            f.Comment = fr.Comment;

            forecastRates.Add(f);
        }

        return View(forecastRates);
    }

...そしてこれは私の見解です(私はMVC 3のRazorビューエンジンを使用しています):

        @inherits System.Web.Mvc.WebViewPage<IEnumerable<dynamic>>

        ...

        <tbody>
            @foreach (var item in Model) {
            <tr>
                <td>@item.RateCodeName</td>
                <td>@item.Year</td>                            
                <td>@item.Rate</td>
                <td>@item.Comment</td>
            </tr>
            }
        </tbody>

LINQ の結果を繰り返し処理して動的オブジェクトのリストを作成する方法が気に入りません。

LINQ クエリ内で各 ExpandoObject を初期化したいのですが、サポートされていないようです

クエリ結果をリストとしてキャストしようとしましたが、匿名型を動的に変換できないため、うまくいきませんでした。

4

2 に答える 2

4

あなたが言ったように、それはサポートされていません。(動的ビューモデルがサポートされていないと言っているのではありません-あなたがやろうとしていることはサポートされていないと言っています)

おそらく LINQ クエリを整理することもできますが、最終的に最善の策は、カスタム ビュー モデルを作成することです。真剣に、それを行うには約30秒かかります。

動的が新しくてクールであることは知っていますが、この場合、カスタム ビュー モデルに固執するだけで、コードがよりきれいになり、保守が容易になります。

私は非常に単純なシナリオでのみ動的ビュー モデルを使用します。ほとんどの場合、私たちがずっとやってきたこと、つまりカスタム ビュー モデルに固執したいと思うでしょう。

于 2010-09-22T06:53:17.697 に答える
0

わかりました、あなたは次のことをすることができます、しかし私はそれをお勧めしません。次のような静的メソッドを作成します

public static IHtmlString DisplayProperty(object obj, string property) {
    return new HtmlString(TypeDescriptor.GetProperties(obj)[property].GetValue(obj).ToString());
}

次に、cshtmlファイルで次の呼び出しを行います(適切な名前空間を使用していることを確認してください)

<tbody>
    @foreach (var item in Model) {
    <tr>
        <td>@DisplayProperty(x, "RateCodeName")</td>
        <td>@DisplayProperty(x, "Year")</td>                            
        <td>@DisplayProperty(x, "Rate")</td>
        <td>>@DisplayProperty(x, "Comment")</td>
    </tr>
    }
</tbody>

これはお勧めしませんが、モデルを必要としない問題の解決策です。

于 2010-09-21T14:32:54.247 に答える