【问题标题】:How to persist ICollection entity property between requests in Razor如何在 Razor 中的请求之间保留 ICollection 实体属性
【发布时间】:2013-12-25 02:23:58
【问题描述】:

我正在处理ASP.NET MVC 4 应用程序。我使用EF 5Code First。我有两个具有 1:N 关系的实体:

public class Menu
{
    //some properties
    public virtual ICollection<Document> Documents { get; set; }
}

和:

public class Document
{
//some properties..
public int MenuID { get; set; }
public virtual Menu Menu { get; set; }
}

我使用[HttpPost][HttpGet] 方法查看Edit。当我像这样通过GET 操作传递模型时:

                Menu model = unitOfWork.MenuRepository.GetById(Id);
                if (model != null)
                {
                    return View(model);
                }

一切正常,我可以看到该模型包含 1 Documents 但如果我只是尝试一下,那么在我的剃刀视图中:

@Html.HiddenFor(m => m.Documents)

然后,当我将表单提交给Post 操作时,我可以看到Documents 属性为空。

如何让Documents保持持久?

【问题讨论】:

    标签: c# asp.net-mvc-4 razor


    【解决方案1】:

    任何带有集合的东西都不会像您期望的那样呈现。你需要创建一个显示模板,它需要一个集合,然后在 HiddenFor 中呈现我们文档的属性,或者如果你不想要显示模板,那么在有问题的视图上做同样的事情。

    例如,这是你需要做的:

    @for(int counter = 0; counter < Model.Documents; counter++)
    {
       @Html.HiddenFor(m => Model.Documents[counter].Id)
       @Html.HiddenFor(m => Model.Documents[counter].Title)
       // and so on
    }
    

    所以现在当您回发时,它具有引擎绑定所需的所有属性,并将其传递给您的控制器方法并提供服务。

    【讨论】:

    • 好吧,我只是为了它而尝试了这个。首先 - 似乎无法将[] 索引器用于ICollection,其次,即使我将实体中的类型更改为其他类型,它仍然不是一个非常优雅的解决方案。
    • 嘿@Leron - 抱歉,我认为你没有使用 ICollection,但我大脑的一部分在说“是的,他是,他在标题中这么说”。该解决方案可能并不优雅,但这是如何做到的。不久前我和你在同一条船上,这很有效。更好的是在显示或编辑器模板中拥有此代码,因此您只需引用它并让模板代替工作。你可以 ToList() 代替给你索引器能力
    • 只是添加,您确实需要索引器,否则 MVC 引擎将无法正确绑定回来。事实上它不会做。这就是引擎的工作原理。我之前尝试过很多方法,但这是唯一的方法——我还读过一篇博文(现在不记得是哪一篇了)证实了同样的事情。
    • 是的,确实需要索引器,但我不确定,我尝试了 aershov 帖子​​中的示例,而 Darin 的示例正在工作并且需要更少的代码编写。老实说,我不确定该选哪一个。
    • 我猜哪个对你有用。 :) 对我来说,我采用的方法不仅有效,而且对 JQuery 更友好。就像我说的,为模板创建一个显示和编辑器,然后在代码中添加。然后无论您想在哪里显示/编辑它,只需使用编辑器模板并传入有问题的集合。工作完成
    【解决方案2】:

    你看过生成的 html 吗?看看)

    This answer 和 this one 提供解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多