[電繪]:Rattus rattus-黑鼠

圖片
  In some eras, rats represented the plague and were despised creatures, but in my eyes, humans and rats are no different. -- 在某些時代裡,老鼠代表著瘟疫,是人們唾棄的生物,然而在我眼裡,人與老鼠並無不同。

[C#]將Model轉UrlAction字串方法

 需求:

使用@Url.Action()的時候,有時候要接的參數太多,因此我就想有沒有辦法可以直接將以有的modal自動轉為RouteValueDictionary帶回controller。

情境:

我有一個model TestModel(圖一),我想把Action Index的model透過A標籤用@Url.Action()傳遞到Action Test(圖二)


圖一


圖二

實做:

(一)建立一個UrlHelper 來將物件轉換成RouteValueDictionary:


 /// <summary>
        /// 物件轉換成RouteValueDictionary
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="obj">物件</param>
        /// <returns></returns>

        public static RouteValueDictionary ObjectToRouteValueDictionary<T>(T obj)
        {
            var rvDic = new RouteValueDictionary();
            foreach (var property in obj.GetType().GetProperties())
            {
                //type符合集合類型(Array暫時沒有)
                if ((property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) ||
                       typeof(ICollection).IsAssignableFrom(property.PropertyType))
                {
                    IEnumerable t = (IEnumerable)property.GetValue(obj);
                    if (t != null)
                    {
                        var i = 0;
                        foreach (var item in t)
                        {
                            rvDic.Add(string.Concat(property.Name, "[", i, "]"), item);
                            i++;
                        }
                    }
                }
                else
                {
                    var value = property.GetGetMethod().Invoke(obj, null) == null ? "" : property.GetGetMethod().Invoke(obj, null);
                    if (!string.IsNullOrEmpty(value.ToString()))
                    {
                        rvDic.Add(property.Name, value);
                    }
                }
            }
            return rvDic;
        }

(二)在VIew使用我們寫好的Helper並將model丟進去


@using ObjectToRouteValueDictionary.Controllers;
@{
    var title = (string)ViewData["ActionName"];
    var item = (HomeController.TestModel)ViewData["TestModel"];
}
<a href="@Url.Action("Test","Home",Library.Helper.UrlHelper.ObjectToRouteValueDictionary<HomeController.TestModel>(item))">TEST ACTION</a>
<h1>@title</h1>
<div>
    A:@item.Astring
    <br />
    B:@item.Bstring
    <br />
    C:@item.Cstring
</div>

結果:成功傳遞




Git支援:

https://github.com/scottHsuHGIGA/ObjectToRouteValueDictionary

留言

這個網誌中的熱門文章

【AutoCAD常見問題】選取物件無藍色高亮顯效果

專題題目該從何開始呢

當兵四個月要帶些什麼? 健保轉出單需要嗎?