【发布时间】:2020-05-07 08:58:00
【问题描述】:
我正在开发一个 MVC 应用程序,它具有 D1、D2、D3 和 D4 阶段,我们将从应用程序中加载/编辑每个阶段。
现在,我已经为每个阶段模型创建了单独的模型和单独的视图,如下所示并使用它。但为了代码重用,我想对所有阶段(D1、D2、D3 和 D4)使用通用视图,因为所有阶段都包含相同的列。
我有一个想法,通过为所有四个阶段创建单个视图模型并加以利用来实现,但我们需要分别编辑和保存这些值。所以我对这一点感到震惊。有没有办法通过加载和保存每个阶段的数据来为所有四个模型使用一个通用视图。
实体
public partial class D1Stage : EntityBase
{
[DisplayName("Status Indicator")]
public byte StatusIndicatorId { get; set; }
[DisplayName("Status Info")]
public string StatusInfo { get; set; }
[DisplayName("Completed %")]
[SCIRange(0, 100)]
public decimal StageCompletion { get; set; }
[DisplayName("Is Step Mandatory")]
public bool IsMandatory { get; set; }
}
正如我提到的,D2Stage、D3Stage 和 D4Stage 具有完全相同的属性,例如 D2Stage:
public partial class D2Stage : EntityBase
{
... exact same properties as D1Stage
}
观看次数
@model Brain.DAL.Entities.D1Stage
@{
IEnumerable<SelectListItem> StatusIndicators = ViewBag.StatusIndicators;
}
@using (Html.BeginForm("", "", FormMethod.Post, new { enctype = "multipart/form-data", @class = "form form-horizontal" }))
{
<div class="form-body">
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Report.Id)
<div class="form-group">
@Html.SCILabelFor(model => model.StatusIndicatorId, new { @class = "col-md-1 control-label" })
<div class="input-group col-md-4">
@Html.DropDownListFor(model => model.StatusIndicatorId, new SelectList(StatusIndicators, "Value", "Text"), "None", new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.StatusIndicatorId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.SCILabelFor(model => model.StatusInfo, new { @class = "col-md-1 control-label" })
<div class="input-group col-md-4">
@Html.TextAreaFor(model => model.StatusInfo, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.StatusInfo, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.SCILabelFor(model => model.StageCompletion, new { @class = "col-md-1 control-label" })
<div class="input-group col-md-4">
@Html.SCINumericTextBoxFor(model => model.StageCompletion, new { @class = "form-control sliderrangemintext", @style = "width:100px" })
<div class="sliderrangemin" id="slider-range-min" style="margin-top:50px"></div>
</div>
</div>
<div class="form-group">
@Html.SCILabelFor(model => model.IsMandatory, new { @class = "col-md-1 control-label" })
<div class="input-group col-md-4">
<div class="input-group" style="width:100%">
@Html.DropDownListFor(model => model.IsMandatory, new List<SelectListItem>() { new SelectListItem { Text = "No", Value = "false" }, new SelectListItem { Text = "Yes", Value = "true", Selected = true } }, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.IsMandatory, "", new { @class = "text-danger" })
</div>
</div>
</div>
</div>
}
正如我上面提到的,所有其他视图都有相同的内容,只是对应的模型不同。例如D2Stage
@model Brain.DAL.Entities.D2Stage
... The difference is just in model.
... Rest of the content is exactly the same as D1Stage view
【问题讨论】:
-
所有模型都有相似的属性?创建单个模型或将属性移动到基类并创建 4 个从基模型派生的模型。然后还创建一个以基本模型为模型的单一视图。
-
不清楚为什么不能在所有阶段都使用相同的
StageViewModel和相同的View?也许您只需要在StageViewModel中添加一个StageNumber来指示当前阶段?
标签: c# .net asp.net-mvc razor view