2017-07-05 11 views
0

私のビューでメタデータを使用したいのですが、私のモデル(ToDoTable)はviewmodel(ModelsViewList)にパックされています。モデルに到達する方法はわかりません。@foreach (ViewData.ModelMetadata.Properties中のvarプロパティ):(動作しません私のビュー内のviewmodelのメタデータに到達できません

モデル:。

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

      }` 
     } 

ビュー:

を210
@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

あなたのプロパティ名は、より多くのあなたのメタデータが参照しているあなたのToDoTableオブジェクトであるプロパティModelDBを、含まれているToDoUI.ModelsViews.ModelsViewListに関連しているようModelDB.IDようにする必要があります。

そうでない場合:

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

これは、あなたが、あなたの性質を通過することができますTodoTableのメタデータを提供します。とにかく、それはあなたが何かまともなことをするのに役立つと確信していません...それはそれのように見えないので:)

+0

はい、私は知っていますが、@ model ToDoUI.ModelsViews.ModelsViewListを変更せずにこれを行う方法 – Marek

+0

確かにあなたの子オブジェクトのメタデータがモデルにロードされているかどうかはわかりません。したがって、TodoTableオブジェクトを新しいビューに渡して、メタデータに確実にアクセスできるようにするのが最善の方法です。しかし、これを行う前にケース "ModelDB.ID"を試すことができます:-) –

+0

私は残念ながらすべてが1つのビューでなければならないプロジェクトに取り組んでいます。 – Marek

1

できません。しかし、問題は、エンティティクラスからメタデータを取得する方法の1つではなく、エンティティクラスが最初にこのメタデータを持つべきではないということです。これらのアノテーションはビューモデルに属します。エンティティクラスは、あなたの視点ではなく、データベースにとって重要なものだけを持つべきです。

+0

いいえ、モデル(ToDoTable)にメタデータとviewmodel(@model ToDoUI.ModelsViews.ModelsViewList)を同じビューに提供する方法はありますか? – Marek

+0

もう一度、ビューモデル。 –

関連する問題