渲染ASP.NET MVC EditorFor

时间:2016-09-27 05:52:33

标签: asp.net-mvc razor

我迟到了一个项目,可能最重要的要求一直被忽略,直到第11个小时。

该应用程序允许供应商通过相当深入的在线申请表申请成为公司的承包商。

该应用程序采用构成左侧边栏导航的问题部分的形式,每个部分都有许多问题。

到目前为止被忽略的要求是每个在线填写表格的申请人都有一个申请类型,例如:建筑,餐饮等以及要求声明应用程序是可配置的,以便只有某些部分出现在某个应用程序类型中,并且某个部分中的某些问题应该可配置为出现在特定的应用程序类型中。

配置这些部分很简单,但配置问题并不容易。目前,所有内容都被硬编码为剃刀视图和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>

我对此问题的解决方案是首先能够将自定义属性添加到ViewModel类,该类将属性标记为可配置的问题,例如

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 ViewModel模板,并为每个部分提供部分属性。

我的问题是:

  1. 这是一个好主意还是有更好的方法。时间是一个约束(一如既往)?
  2. 我可以按照上面概述的方式使用pseduo代码创建html字符串,该代码循环遍历属性并调用部分内容吗?

1 个答案:

答案 0 :(得分:0)

您可以在此处继续

假设您要使用循环在主页中调用的部分页面是:

_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将被调用为:

@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; }       
    }