2016-09-27 67 views
0

我很晚纔開始一個項目,其中可能最重要的要求直到第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視圖模型模板,並有部分的每個部分,屬性。

我的問題是:

  1. 這是一個好主意,或者是有更好的辦法。時間是一個約束(一如既往)?
  2. 我可以用上面概述的方式創建html字符串,並使用pseduo代碼來循環顯示屬性並調出部分代碼?

回答

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,其中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; }  
    }