【发布时间】:2019-04-01 12:18:10
【问题描述】:
我的抽象超类 TogglePanelViewModel 有 5 个可覆盖的属性 4 是虚拟的,因为它设置了默认值和一个摘要。我想用这个摘要 部分视图中的视图模型,然后由继承 TogglePanelViewModel 的子类呈现。
我的问题是:-
- 这是正确的方法还是可以以其他方式实施?
- 由于我无法创建 TogglePanelViewModel 的实例,如何将视图模型(子类)传递到部分视图模型中?
这里是代码
抽象视图模型:
public abstract class TogglePanelViewModel
{
public abstract string LSName { get; }
public virtual string LabelText { get; set; } = "Hide welcome text|Show welcome text";
public virtual string StyleClass { get; set; } = "";
public virtual string StylePullRight { get; set; } = "pull-right";
public virtual bool RenderLabelAfterToggle { get; set; } = false;
}
使用抽象视图模型共享局部视图:
@model App.Website.Areas.Default.ViewModels.TogglePanelViewModel
<div class="@Model.StyleClass toggle-filter @Model.StylePullRight" id="ls" name="@Model.LSName">
@if (Model.RenderLabelAfterToggle == false)
{
<div class="toggle-label">
<span>@Model.LabelText</span>
</div>
}
<div class="common-slide-checkbox @Model.StylePullRight">
<input type="checkbox" value="1" id="toggle-filter-visible">
<label for="toggle-filter-visible" id="toggle-pos"></label>
<div id="toggle-bg"></div>
</div>
@if (Model.RenderLabelAfterToggle == true)
{
<div class="toggle-label">
<span>@Model.LabelText</span>
</div>
}
</div>
例如:1个继承TogglePanelViewModel的基类
这会报错
The model item passed into the dictionary is of type 'App.Website.Areas.Create.Models.IdeationViewModel', but this dictionary requires a model item of type 'App.Website.Areas.Default.ViewModels.TogglePanelViewModel'.
也无法创建实例 new TogglePanelViewModel { }
查看:
@using App.Website.Areas.Default.ViewModels
@model App.Website.Areas.Create.Models.IdeationViewModel
<div>
@Html.Partial("~/Views/Shared/TogglePanel.cshtml", Model.ToggleIdeationFilter)
</div>
查看模型:
public class IdeationViewModel
{
...
public ToggleIdeationFilterVM ToggleIdeationFilter { get; set; }
}
public class ToggleIdeationFilterVM : TogglePanelViewModel
{
public override string LSName => null;
public override string LabelText => "Hide filter|Show filter";
}
谢谢
【问题讨论】:
-
IdeationViewModel和TogglePanelViewModel是两个不同的类。你需要从IdeationViewModel继承TogglePanelViewModel来实现你现在正在寻找的东西 -
我不能这样做,因为我想在 ToggleIdeationFilterVM 中设置属性。我可能可以从 IdeationViewModel 继承 ToggleIdeationFilterVM 但我觉得这可以写成更好的方式
-
那么你应该将
ToggleIdeationFilterVM的实例作为模型传递给视图。不是TogglePanelViewModel的实例 -
就是这样,谢谢。不知道为什么我没有想到这个..
标签: c# razor model abstract superclass