0

2010年のこの回答によると、mvc-2に関しては不可能でした。asp.net-core 2.2 ではどうでしょうか。

私のユースケース:

(ユーザー用) と(管理者用) のBaseViewModel2 つのビューで使用されている があります。はによって呼び出されます。以下にいくつかのサンプルを示します。TableViewTableManagentViewBaseViewModelViewComponent

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いますが、この解決策は私には魅力的ではありません。その長所と短所は何ですか?

4

1 に答える 1