根据2010 年的这个答案,关于 mvc-2,这是不可能的。现在,在 asp.net-core 2.2 中呢?
我的用例:
我有一个BaseViewModel
被 2 个视图使用的视图:(TableView
对于用户)和TableManagentView
(对于管理员)。由BaseViewModel
a 调用ViewComponent
。以下是一些示例:
基础视图模型:
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);
}
}
基本视图组件:
@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
or TempData
,但这个解决方案对我没有吸引力。这样做的利弊是什么?