渲染ASP.NET MVC编辑器的自定义部分对于
问题描述:
我很晚才开始一个项目,其中可能最重要的要求直到第11个小时才被忽略。渲染ASP.NET MVC编辑器的自定义部分对于
该应用程序允许供应商通过相当深入的在线申请表申请成为公司的承包商。
应用程序采用问题部分的形式组成左边栏导航栏,每个部分都有一些问题。
到目前为止,被忽略的要求是在网上填写表格的每个申请人都具有应用类型,例如,建筑,餐饮等,并且要求声明应用程序是可配置的,以便只有某些部分显示某种应用程序类型,并且部分中的某些问题应该可配置为显示特定应用程序类型。
配置部分很简单,但配置问题并不容易。目前,所有内容都被硬编码为剃须刀视图和EditorFor
模板。基本上每个ViewModel有一个EditorFor
,它构成了一个Section。
@model Models.Enforcement
<div >
<form class="form-horizontal" method="post" action="@Url.Action(nameof(ApplicationController.Enforcements))"
@Html.EditorFor(x => x)
</div>
而编辑器将会是这个样子:
@model GSCM.Logic.Web.Models.Enforcement
@using System.Web.Mvc.Html
<div>
@Html.HiddenFor(x => x.Id)
<div class="form-group">
@Html.LabelFor(model => model.Name)
<div>
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
我对这个问题的解决方法是首先的可以添加自定义属性的视图模型类标签的属性作为可配置的问题,例如
public class Enforcement
{
[ApplicationQuestion DisplayOrder=1, Partial="DifferentNamedPartial"]
public string Name{get;set;}
}
然后我有我自己的EditorFor
通过这些标记属性循环:
using System.Web.Mvc.Html;
public static class HtmlHelperExtensions
{
public static MvcHtmlString QuestionSetEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, VMBaseClass model)
{
//PSEUDO CODE
var sectionHtml;
ForEach(var taggedProperty in model)
{
var basedOnProperty = GetFilePathFromProperty(taggedProperty);
sectionHtml += System.Web.Mvc.Html.GetPartial(basedOnProperty)
}
return MvcHtmlString.Create(sectionHtml);
}
}
所以基本上,我需要砍现有EditorFor视图模型模板,并有部分的每个部分,属性。
我的问题是:
- 这是一个好主意,或者是有更好的办法。时间是一个约束(一如既往)?
- 我可以用上面概述的方式创建html字符串,并使用pseduo代码来循环显示属性并调出部分代码?
答
在这里,您可以继续像
假设要在使用循环主要页面打电话给你的部分页面:
_form-one-partial.cshtml
_form-two-partial.cshtml
_form-three-partial.cshtml
_form-four-partial.cshtml
_form-five-partial.cshtml
其中的一个部分页面内容为:
@model PartialFieldViewModel
//---other fileds on the page
<input type="text"/>
//---other fileds on the page
要根据主页中“partial”变量的循环调用partial,其中partial将被调用为:
@model PartialViewModel
foreach (var partial in Model.Parital)
{
@Html.Partial("_form-{0}-partial".FormatWith(partial.PartialType.ToString().ToLower()), partial)
}
局部视图模态类作为
public class PartialViewModel
{
//Other properties
public List<PartialFieldViewModel> Partial { get; set; }
}
public class PartialFieldViewModel
{
//Other properties
public Constants.PartialType PartialType{ get; set; }
}