【问题标题】:Passing in model to partial view using abstract class使用抽象类将模型传递给局部视图
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多