2010年のこの回答によると、mvc-2に関しては不可能でした。asp.net-core 2.2 ではどうでしょうか。
私のユースケース:
(ユーザー用) と(管理者用) のBaseViewModel
2 つのビューで使用されている があります。はによって呼び出されます。以下にいくつかのサンプルを示します。TableView
TableManagentView
BaseViewModel
ViewComponent
BaseViewModel:
public class BaseViewModel {
[Display(Name = "Comment")
public string UserComment { get; set; }
}
テーブルビュー:
@await Component.InvokeAsync(nameof(Base), new { myObject = myObject, stringName = "User"})
テーブル管理ビュー:
@await Component.InvokeAsync(nameof(Base), new { myObject = myObject, stringName = "Admin"})
ベース:
public class Base : ViewComponent
{
public IViewComponentResult Invoke(BaseViewModel myObjet, string invokingView)
{
// here i want to do something like that
if (invokingView == "User") {
myObject.UserComment.SetDisplayName("My Comment");
}
if (invokingView == "Admin") {
myObject.UserComment.SetDisplayName("User's Comment");
}
return View("BaseViewComponent", myObject);
}
}
BaseViewComponent:
@Html.DisplayNameFor(model => model.UserComment)
はBaseViewModel
簡略化されていますが、さらに多くの属性があります。これを行う理由は、両方のテーブルでコードが重複しないようにするためです。変更する必要があるのは、ラベル名だけです。
私は試しましreflection
たが、成功しませんでした:
public IViewComponentResult Invoke(BaseViewModel myObject, string invokingView)
{
MemberInfo property = typeof(BaseViewModel).GetProperty("UserComment");
property.GetCustomAttributes(typeof(DisplayAttribute)).Cast<DisplayAttribute>().Single().Name = "test";
return View("BaseViewComponent", myObject);
}
はName
変化せず"Comment"
、初期設定のままです。
属性名をプログラムで設定できない場合、他にどのような解決策がありますか? ViewBag/ViewData
またはについて考えてTempData
いますが、この解決策は私には魅力的ではありません。その長所と短所は何ですか?