2017-07-05 25 views
0

我想在我的视图中使用元数据,但我的模型(ToDoTable)打包在viewmodel(ModelsViewList)中,我不知道如何触及模型。@foreach (在ViewData.ModelMetadata.Properties VAR属性)不工作:(在我看来,无法在视图模型中达到元数据

型号:

public partial class ToDoTable 
     { 
      [HiddenInput(DisplayValue = false)] 
      public int ID { get; set; } 

      [Required(ErrorMessage = "Please write name of event.")] 
      public string EventName { get; set; } 



      [MaxLength(50, ErrorMessage = "Description must be shorter than 50 characters ")] 
      [Required(ErrorMessage = "Proszę podać opis.")] 
      public string Description { get; set; } 


      [Display(Name = "Tu wpisz format daty")] 
      [DataType(DataType.Date, ErrorMessage = "Date mast be in format described")] 
      public string Data { get; set; } 
     } 

控制器:

using System.Web.Mvc; 
     using ToDoLibrary.Abstract; 
     using ToDoUI.ModelsViews; 

     namespace ToDoUI.Controllers 
     { 
      public class HomeController : Controller 
      { 
       IToDoRepository repository; 
       public HomeController(IToDoRepository rep) 
       { 
        repository = rep; 
       } 
       public ViewResult List() 
       { 
        ToDoLibrary.ToDoTable model = new ToDoLibrary.ToDoTable(); 
        ModelsViewList modelView = new ModelsViewList() 
        { 
         FromRepository = repository.FromRepository, 
         ModelDB = model 
        }; 
        return View(modelView); 
       } 

      }` 
     } 

查看:

@model ToDoUI.ModelsViews.ModelsViewList 
    @{ 
     ViewBag.Title = "List"; 
    } 
    <div class="row"> 
     <div class="col-lg-6 main tile1 col-lg-push-6"> 
      pierwsza kolumna 

      @using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) 
      { 
       <div class="panel-body"> 

        @foreach (var property in ViewData.ModelMetadata.Properties) 
        { 
         switch (property.PropertyName) 
         { 
          case "ID": 


           break; 
          default: 
           <div class="form-group"> 
            <label>@(property.DisplayName ?? property.PropertyName)</label> 
            @if (property.PropertyName == "Description") 
           { 
             @Html.TextArea(property.PropertyName, null, new { @class = "form-control", rows = 5 }) 
            } 
            else 
            { 
             @Html.TextBox(property.PropertyName, null, new { @class = "form-control" }) 
            } 
            @Html.ValidationMessage(property.PropertyName) 
           </div> 
           break; 
         } 
        } 
       </div> 
       <div class="panel-footer"> 
        <input type="submit" value="Zapisz" class="btn btn-primary" /> 
        @Html.ActionLink("Anuluj i wróć do listy", "Index", null, new 
       { 
        @class = "btn btn-default" 
       }) 
       </div> 
      } 
     </div> 
    </div> 

回答

1

你的属性名称应该更像ModelDB.ID作为元数据是有关ToDoUI.ModelsViews.ModelsViewList其中包含一个属性ModelDB,这是你所引用的ToDoTable对象。

否则:

var metaData = ModelMetadataProviders. 
    Current.GetMetadataForType(null, Model.ModelDB.GetType()); 

这会给你TodoTable的元数据,那么你可以通过你的属性。无论如何,我不知道它会帮助你做一些体面的事情......因为它看起来不会像:)

+0

是的我知道,但没有改变@model如何做到这一点ToDoUI.ModelsViews.ModelsViewList – Marek

+0

我不确定你的子对象的元数据是否加载到模型中。所以最好的方法是将TodoTable对象传递到一个新的视图中,在这个视图中你一定可以访问你的元数据。但是你可以在做这件事之前尝试一下“ModelDB.ID”的案例:-) –

+0

我正在处理项目,不幸的是所有事情都必须在一个视图中。 – Marek

1

你不能。然而,问题不在于如何从实体类获取元数据,而是实体类首先不应该具有此元数据。这些注释属于您的视图模型。实体类只应该对数据库有重要意义,而不是你的观点。

+0

好的,但是有没有办法通过元数据和viewmodel(@model ToDoUI.ModelsViews.ModelsViewList)向同一个视图提供模型(ToDoTable)? – Marek

+0

不需要。查看模型。 –

相关问题