复杂对象的MVC Razor形式

时间:2015-12-10 15:36:35

标签: c# asp.net-mvc entity-framework razor

我正在构建一个基于Web的工具,供我们的IT团队用来处理我们的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; }
}

我想创建一个表单来加载给定的&#34; ITDeptID&#34;的所有检查。

public ActionResult LoadView(int TeamID)
{
    ViewData["NeededChecks"] = _db.Checks.Where(p => p.ITDeptID == TeamID).ToList();

    return View();
}

然后获取该数据并将其与每次检查的结果一起保存。

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

创建表单的最佳方法是什么,其中有一个分配给传递给它的ITDeptID的Check条目。

这是我到目前为止所做的。

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

我确实尝试过创建一个EditorTempalte,但它没有加载。

非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以从模型 - 视图 - 视图模型方法中受益,您将从本质上做什么:

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

这是一个非常非常原始的例子。从本质上讲,这段代码反映的是我相信你的意图。因此,您将两个域实体传递到这个新类中,该类将以准确反映该页面内容的方式执行所需的检查并直接输出到您的页面上。因此,在这个简单的示例中,它将为我添加一个属性ValidAccountForProduct,因此如果用户处于所述角色,他们应该会看到此产品。因此,在我使用Razor的前端:

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

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