使用抽象类将模型传递给部分视图


我的抽象超类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>

例如:继承TogglePanelViewModel 的基类的1

这将给出错误

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'.

也无法创建新的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";
}

感谢

答案:将ToggleIdeationFilterVM实例作为模型传递到局部视图:-

@Html.Partial("~/Areas/Default/Views/Shared/TogglePanel.cshtml", new ToggleIdeationFilterVM())

最新更新