需求:
使用@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
留言
張貼留言