2013-12-19 5 views
0

У меня есть следующие модели:Добавить префикс EditorFor для всех элементов

public class CaseFormViewModel 
{ 
    public int ID { get; set; } 
    public int AppID { get; set; } 

    public CaseGeneralFormViewModel General { get; set; } 

    public CaseMedicalFormViewModel Medical { get; set; } 

    public CaseLegalFormViewModel Legal { get; set; } 

    public CaseCommentsFormViewModel Comments { get; set; } 

    public List<UploadedDocumentModel> Attachments { get; set; } 

    public string AzureStorage { get; set; } 

} 

public class CaseGeneralFormViewModel : CaseGeneralViewModelBase 
{ 
    [Required] 
    public new string PatientName { get; set; } 

также у меня есть вид с моделью CaseFormViewModel и имеет частичный вид с моделью CaseGeneralFormViewModel. Посмотреть загружает этот частичный вид:

@Html.Partial("PartialCaseGeneralForm", Model.General) 

Частичный вид имеет следующую строку:

@Html.ValidationMessageFor(model => model.PatientName) 

тогда, когда я отправляю эту точку зрения на метод контроллера:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult UpdateCase(int AppID, CHFN.Models.CaseFormViewModel model) 
    { 

model.General является ноль. Я понимаю, почему, поскольку PatientName должен иметь id = «General.PatientName» вместо id = «PatientName», но как я могу добавить этот префикс для всех элементов на странице?

Я вижу некоторую способность сделать это: изменить метод пост контроллера для:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult UpdateCase(int AppID, CaseGeneralFormViewModel general) 
    { 

но первым на всех, код загрязнен (структура внутренних классов сломаны), во-вторых - любой класс (т.е. CaseGeneralFormViewModel) могут иметь 2 свойства одного и того же класса (т.е.

public Class1 Prop1 { get; set; } 
public Class1 Prop2 { get; set; } 

). Как решить эту проблему - я не знаю ....

ответ

1

Решение:

Создать метод Удлинитель для частичного:

public static MvcHtmlString PartialFor<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, 
     string partialViewName) 

{ 
     var name = ExpressionHelper.GetExpressionText(expression); 
     var model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model; 
     var viewData = new ViewDataDictionary(helper.ViewData) 
     { 
      TemplateInfo = new System.Web.Mvc.TemplateInfo 
      { 
       HtmlFieldPrefix = name 
      } 
     }; 
     return helper.Partial(partialViewName, model, viewData); 
} 

и использование:

@Html.PartialFor(m=>m.General,"PartialCaseGeneralForm") 
0

В asp.net core mvc

public static class HtmlHelperPartialExtensions 
{ 
    public static IHtmlContent PartialWithPrefix(this IHtmlHelper htmlHelper, string partialViewName, object model, string prefix) 
    { 
     var htmlFieldPrefix = (string.Empty.Equals(prefix) ? "." : "") + prefix; 
     return htmlHelper.Partial(partialViewName, model, new ViewDataDictionary(htmlHelper.ViewData) { TemplateInfo = { HtmlFieldPrefix = htmlFieldPrefix } }); 
    } 

    public static Task<IHtmlContent> PartialWithPrefixAsync(this IHtmlHelper htmlHelper, string partialViewName, object model, string prefix) 
    { 
     var htmlFieldPrefix = (string.Empty.Equals(prefix) ? "." : "") + prefix; 
     return htmlHelper.PartialAsync(partialViewName, model, new ViewDataDictionary(htmlHelper.ViewData) {TemplateInfo = {HtmlFieldPrefix = htmlFieldPrefix}}); 
    } 

    public static IHtmlContent PartialWithPrefixFor<TModel, TProperty>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string partialViewName) 
    { 
     string prefix = ExpressionHelper.GetExpressionText(expression); 
     object model = ExpressionMetadataProvider.FromLambdaExpression(expression, helper.ViewData, helper.MetadataProvider).Model; 
     return PartialWithPrefix(helper, partialViewName, model, prefix); 
    } 

    public static Task<IHtmlContent> PartialWithPrefixForAsync<TModel, TProperty>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string partialViewName) 
    { 
     string prefix = ExpressionHelper.GetExpressionText(expression); 
     object model = ExpressionMetadataProvider.FromLambdaExpression(expression, helper.ViewData, helper.MetadataProvider).Model; 
     return PartialWithPrefixAsync(helper, partialViewName, model, prefix); 
    } 
} 
Смежные вопросы