C# 面向复杂对象的MVC Razor表单

C# 面向复杂对象的MVC Razor表单,c#,asp.net-mvc,entity-framework,razor,C#,Asp.net Mvc,Entity Framework,Razor,我正在为我们的IT团队构建一个基于web的工具,用于处理我们的IT检查并记录结果 我正在使用实体框架 这是我每次检查的目的 public class Check { [Key] public int CheckID { get; set; } //public ICollection<ITDept> ItDepts { get; set; } //[UIHint("TeamEditor")] public int ITDeptID { get;

我正在为我们的IT团队构建一个基于web的工具,用于处理我们的IT检查并记录结果

我正在使用实体框架

这是我每次检查的目的

public class Check
{
    [Key]
    public int CheckID { get; set; }
    //public ICollection<ITDept> ItDepts { get; set; }
    //[UIHint("TeamEditor")]
    public int ITDeptID { get; set; }
    public string CheckName { get; set; }
    public string LinkToCheck { get; set; }
    public string Description { get; set; }
}
然后将数据与每次检查的结果一起保存

public class HistoricChecks
{        
    [Key]
    public int Id { get; set; }
    public string SentBy { get; set; }
    public DateTime SentTime { get; set; }
    public List<CheckLink> Checks { get; set; }
}

public class CheckLink
{

    [Key]
    [Column(Order = 0)]
    public int CheckEntryId { get; set; }

    [Key]
    [Column(Order = 1)]
    public int LinkedCheckID { get; set; }
    public int CheckIDFromList { get; set; }
    public bool PassFail { get; set; }
    public string Comments { get; set; }
}
公共类历史检查
{        
[关键]
公共int Id{get;set;}
公共字符串SentBy{get;set;}
公共日期时间SentTime{get;set;}
公共列表检查{get;set;}
}
公共类校验链接
{
[关键]
[第列(顺序=0)]
public int CheckEntryId{get;set;}
[关键]
[第列(顺序=1)]
public int LinkedCheckID{get;set;}
public int CheckIDFromList{get;set;}
公共bool PassFail{get;set;}
公共字符串注释{get;set;}
}
创建一个表单的最佳方法是什么,在该表单中有一个分配给传递给它的ITDeptID的检查条目

这就是我目前所拥有的

@using AppSupportCommunicationTool.Models
@model  HistoricChecks
<body>
    @using (Html.BeginForm("Post", "Form", FormMethod.Post, new { @name = "MainForm" }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <fieldset>
            <table width="1000" align="center">

                @foreach (var check in ViewData["NeededChecks"] as List<Check>)
                {
                    <tr>
                        <td>
                            Check Name: @{ @check.CheckName }
                            <br />Check documentation: @{ @check.LinkToCheck }
                            <br />Check Description: @{ @check.Description }
                        </td>
                        <td>
                            @Html.EditorFor(m => m.Checks)
                        </td>
                    </tr>
                }
            </table>
        </fieldset>
        <input type="submit" />
    }
</body>
@使用AppSupportCommunicationTool.Models
@模型历史检查
@使用(Html.BeginForm(“Post”,“Form”,FormMethod.Post,new{@name=“MainForm”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@foreach(ViewData[“NeededChecks”]中的var检查作为列表)
{
检查名称:@{@Check.CheckName}

检查文档:@{@Check.LinkToCheck}
检查说明:@{@Check.Description} @EditorFor(m=>m.Checks) } }
我确实尝试过创建一个EditorTemplate,但没有加载


非常感谢。

您可以从模型-视图-模型方法中获益,您将在本质上做到:

public class ProductViewModel
{
     private Product product;
     private List<Account> account;

     public ProductViewModel(Product product, List<Account> account)
     {
          this.product = product;
          this.account = account;
     }

     public bool ValidAccountForProduct
     {
          get
          {
               var result = account.Where(i => i.Role == 3 || i.Role == 1);
               if(result.Any())
                   return true;

               return false;
          }
     }
}

显然,您需要使用视图的任何其他信息填充产品和帐户,但这将是一种清晰简洁的方法,而不是操纵
ViewData
来表示。

您不会使用
ViewData
将数据传递到视图。你应该使用一个模型。这就是为什么它被称为MVC(模型-视图-控制器)。在开始编写代码之前,请阅读有关asp.net MVC的更多信息。我理解这一点,但我正在将不同模型的数据传递给我的表单将使用的模型。您告诉我“它未加载”。那么什么是未加载的呢?如果您的意思是虽然视图按预期呈现,但没有数据,那么您是否尝试在控制器中放置断点以检查您的实体框架查询是否返回任何结果?@TomKelly,那么您应该创建一个视图模型,并将两个模型中的数据组合起来。@ataravati是对的,这也是我的建议
public class ProductViewModel
{
     private Product product;
     private List<Account> account;

     public ProductViewModel(Product product, List<Account> account)
     {
          this.product = product;
          this.account = account;
     }

     public bool ValidAccountForProduct
     {
          get
          {
               var result = account.Where(i => i.Role == 3 || i.Role == 1);
               if(result.Any())
                   return true;

               return false;
          }
     }
}
@Model List<ProductViewModel>
@foreach(var model in Model)
{
     if(model.ValidAccountForProduct)
     {
          // Output those Products.
     }
}