亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET MVC - 將動態 ExpandoObject 從控制器傳遞到視圖時出現

ASP.NET MVC - 將動態 ExpandoObject 從控制器傳遞到視圖時出現

C#
郎朗坤 2022-12-24 10:16:03
由于不可能將多個模型傳遞給 ASP.NET MVC 4 中的視圖,我試圖將各種模型填充到一個動態模型中ExpandoObject,然后從視圖中將其解包。我的模型(不僅僅包含這個類,但為了簡潔起見,我只展示這個):public class Modular_ArtistModel{    public string Artist_Name { get; set; }}我的控制器:( 我不僅僅是將這個List<>對象打包到dynamic對象中,但為了簡潔起見......)dynamic ArtistModel = new ExpandoObject();        var Modular_ArtistModel = LoadSP_Modular_ArtistModel("sp_Mod_Artist_Artist", i);        List<Modular_ArtistModel> mod_ArtistModel = new List<Modular_ArtistModel>();        foreach (var row in Modular_ArtistModel)        {            mod_ArtistModel.Add(new Modular_ArtistModel            {                Artist_Name = row.Artist_Name            });        }        ArtistModel.Artist = mod_ArtistModel;我的觀點:( 這是視圖中的第一件事,程序因以下任務而窒息)@model dynamic@{string artist_Name = Model.Artist.Artist_Name;}當光標到達View層上面的assignment時,拋出如下異常:'Model.Artist.Artist_Name' threw an exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'Data: {System.Collections.ListDictionaryInternal}HResult: -2146233088HelpLink: nullInnerException: nullMessage: "'System.Collections.Generic.List<....Models.Modular_ArtistModel>' does not contain a definition for 'Artist_Name'"Source: "Anonymously Hosted DynamicMethods Assembly"StackTrace: "   at CallSite.Target(Closure , CallSite , Object )\r\n   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)"TargetSite: {System.Object CallSite.Target(System.Runtime.CompilerServices.Closure, System.Runtime.CompilerServices.CallSite, System.Object)}有誰知道我需要做什么來解決這個問題?不確定這是快速修復還是更廣泛的重新設計。
查看完整描述

2 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我認為使用動態對象不是一個好主意,默認情況下視圖是強類型的,沒有模型就無法創建基于屬性的模型驗證......


通過參考官方文檔和其他資源,您可以使用擴展方法將對象轉換為 ExpandoObject 并且您的函數應該可以工作:


擴展方法:


public static ExpandoObject ToExpando(this object anonymousObject)

{

    IDictionary<string, object> anonymousDictionary =  new RouteValueDictionary(anonymousObject);

    IDictionary<string, object> expando = new ExpandoObject();

    foreach (var item in anonymousDictionary)

        expando.Add(item);

    return (ExpandoObject)expando;

}

在您的控制器方法的返回中嘗試添加:


return ( "yourView", ArtistModel.ToExpando() ); 

解釋:


這樣做的原因是匿名類型在內部傳遞給控制器,因此只能從聲明它的程序集中訪問它。由于視圖是單獨編譯的,因此動態綁定器抱怨它無法越過該程序集邊界。


但是如果你仔細想想,動態綁定器的這種限制實際上是人為的,因為如果你使用私有反射,沒有什么可以阻止你訪問那些內部成員(是的,它甚至可以在中等信任中工作)。因此,默認的動態綁定器正在竭盡全力執行 C# 編譯規則(您無法訪問內部成員),而不是讓您執行 CLR 運行時允許的操作。


查看完整回答
反對 回復 2022-12-24
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

您發送列表藝術家但嘗試獲得一位藝術家您應該更改此

string artist_Name = Model.Artist.Artist_Name;

string artist_Name= Model.Artist.FirstOrDefault().Artist_Name;

要么

改變

@model dynamic

@model ExpendoObject


查看完整回答
反對 回復 2022-12-24
  • 2 回答
  • 0 關注
  • 121 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號