【问题标题】:Can't reach metadata in viewmodel in my view在我的视图中无法访问视图模型中的元数据
【发布时间】:2017-07-05 22:44:34
【问题描述】:

我想在我的视图中使用元数据,但我的模型(ToDoTable)包含在视图模型(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>

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您的属性名称应该更像ModelDB.ID,因为您的元数据与包含属性ModelDBToDoUI.ModelsViews.ModelsViewList 相关,这是您引用的ToDoTable 对象。

    否则:

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

    这将为您提供 TodoTable 的元数据,然后您可以浏览您的属性。无论如何,我不确定它会帮助你做一些像样的事情......因为它看起来不像它会:)

    【讨论】:

    • 是的,我知道,但是如何在不更改 @model ToDoUI.ModelsViews.ModelsViewList 的情况下做到这一点
    • 我不确定您的子对象的元数据是否已加载到模型中。所以最好的方法是在一个新视图中传递你的 TodoTable 对象,在那里你肯定可以访问你的元数据。但是您可以在执行此操作之前尝试案例“ModelDB.ID”:-)
    • 我正在做一个项目,不幸的是,一切都必须在一个视图中。
    • 查看次数不能超过一个:(。这是招聘流程项目。
    • 即将出现的消息“无法从 'ToDoLibrary.ToDoTable' 转换为 'System.Func '
    【解决方案2】:

    你不能。然而,问题不在于如何从实体类中获取元数据,而是实体类一开始就不应该有这个元数据。这些注释属于您的视图模型。实体类应该只包含对数据库重要的东西,而不是你的视图。

    【讨论】:

    • 好的,但是有什么方法可以为模型(ToDoTable)提供元数据和视图模型(@model ToDoUI.ModelsViews.ModelsViewList)到同一个视图?
    • 没有。同样,将视图逻辑放在您的视图模型上。
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多