0

在这个项目上工作,我又被困住了。我认为我需要在侧面显示一个菜单。菜单是从表中提取的。除此之外,我还有一个问题来自另一张桌子。在这里面,会有一些建议是从另一个表中提取的。对于这个问题,我有几个输入、单选按钮和一个用于反馈的文本框,它们最终会出现在不同的表格中。所有这些都必须使用主表中的 ID 进行,这样当信息保存在结果表中时,它也知道它属于哪个主记录。可以使用 /Audit/302 调出该页面,但是当您将子菜单更改为下一个问题时,您如何获得该问题并维护 ID。对于每个问题,都会有该 ID 的条目。我已经建立了关系,这就是它的样子。 关系

2011 年 8 月 2 日

我添加了一个 ViewModel,它从名为 Score (OK, Concern, N/A) 的表中提取复选框列表

我拥有的页面使用 ID 呈现,它从 AuditSchedules 中提取记录并检索一些信息。在布局中,我还有一个侧面菜单(部分),它呈现将选择不同部分的操作链接列表和一个 MainQuestion(部分)。我们一直在努力。由于我添加了 viewModel 来填充复选框并将文本保存到具有 AuditSchedule 和 MainQuestion 的 ID 的表中。我的问题是我要求 id 从表中为分数选择 id,它正在从 AuditSchedule 中获取 id。给我一个没有找到数据。这是我的控制器:

        //get
    public ActionResult _Forms(int score)
    {
        AuditFormEdit viewModel = new AuditFormEdit();
        viewModel.ScoreInstance = _db.Scores.Single(r => r.ScoreID == score);
        viewModel.InitializeScoreCheckBoxHelperList(_db.Scores.ToList());
        return View(viewModel);
    }

    //post
    [HttpPost]
    public ActionResult _Forms(int score, AuditFormEdit viewModel)
    {
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToScores();
            _db.Entry(viewModel.ScoreInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("/");
        }
        else
        {
            return View(viewModel);
        }
    }

这是我的视图模型:

    public class AuditFormEdit
{
    public Models.Score ScoreInstance { get; set; }

    public List<ScoreCardCheckBoxHelper> ScoreCardCheckBoxHelperList { get; set; }

    public void InitializeScoreCheckBoxHelperList(List<Models.Score> ScoreList)
    {
        if (this.ScoreCardCheckBoxHelperList == null)
            this.ScoreCardCheckBoxHelperList = new List<ScoreCardCheckBoxHelper>();

        if (ScoreList != null
            && this.ScoreInstance != null)
        {
            this.ScoreCardCheckBoxHelperList.Clear();
            ScoreCardCheckBoxHelper spacerProductCheckBoxHelper;
            string spacerTypes =
                string.IsNullOrEmpty(this.ScoreInstance.ScoreName) ?
                string.Empty : this.ScoreInstance.ScoreName;
            foreach (Models.Score scoreType in ScoreList)
            {
                spacerProductCheckBoxHelper = new ScoreCardCheckBoxHelper(scoreType);
                if (spacerTypes.Contains(scoreType.ScoreName))
                    spacerProductCheckBoxHelper.Checked = true;
                this.ScoreCardCheckBoxHelperList.Add(spacerProductCheckBoxHelper);
            }
        }
    }

    public void PopulateCheckBoxsToScores()
    {
        this.ScoreInstance.ScoreName = string.Empty;
        var scoreType = this.ScoreCardCheckBoxHelperList.Where(x => x.Checked)
                              .Select<ScoreCardCheckBoxHelper, string>(x => x.ScoreName)
                              .AsEnumerable();
        this.ScoreInstance.ScoreName = string.Join(", ", scoreType);
    }


    public class ScoreCardCheckBoxHelper : Models.Score
    {
        public bool Checked { get; set; }

        public ScoreCardCheckBoxHelper() : base() { }

        public ScoreCardCheckBoxHelper(Models.Score scoreCard)
        {
            this.ScoreID = scoreCard.ScoreID;
            this.ScoreName = scoreCard.ScoreName;
        }
    }

}

这是拉动页面的链接和控制器,这是布局的主体:

        public ActionResult Audit(int id)
    {
        var auditToDetail  = _db.AuditSchedules.Single(r => r.AuditScheduleID == id);
        return View(auditToDetail);
    }

链接如下所示:

/AuditSchedule/Audit/257

需要帮助请叫我。

我使用了代码优先的方法,并且所有表都具有调用关系的模型。

谢谢你

4

1 回答 1

0

你的问题很笼统 - 但这里有一些事情需要考虑。

首先,在 MVC3 中,您通常希望将视图强类型化到模型中。在您的情况下,您希望每个模型都有一个视图。您不希望“一个视图中有多个模型”,而是希望多个视图一起呈现在一个页面上 - 所有这些都由一些公共数据链接。

实现此目的的一种方法是[ChildActionOnly]在控制器中设置编写“子操作”(使用:属性),以填充每个单独的模型,将它们发送到各自的单独视图。您可以在任何视图中使用 [Html.RenderAction][3] 函数来渲染任何其他视图。组织它的最简单方法通常是使用布局 4 - 您可以使用 渲染所有视图Html.RenderAction(),然后将主窗体渲染为主视图(在布局中显示@RenderBody())。

要填充每个模型,您可能需要知道一些数据(如 id),这些数据可以存储在 ViewBag 或 ViewData 中,并作为Html.RenderAction函数中的对象传入。(如果您使用 razor,则视图中的调用可能类似于:@{Html.RenderAction("actionName", new {object1 = "xyz", object2 ="abc"});}为了清楚起见,逻辑流程将如下所示

  1. 使用渲染子视图所需的数据填充 ViewBag,
  2. 为主窗体填充模型,然后调用主窗体的视图(您的主视图)。
  3. 您的主视图定义了一个布局视图,该视图反过来调用Html.RenderAction,使用 ViewBag 数据设置适当的对象。
  4. 布局还将主视图呈现为“主体”( @RenderBody())。

这样做的最终结果是视图可以 [强类型化][7] 到各个视图,以及每个模型的各个控制器操作。这是一件好事,因为它使您的视图可以在任何地方重用,并且隔离了填充每个模型的逻辑(因为每个模型在控制器中都有自己的操作)。如果您对模型进行后续更改,则很容易知道需要修改哪个 Action/Model/View。

以下是一些资源,可帮助您开始了解在单个页面上呈现多个模型的选项。我很抱歉没有在这篇文章中添加指向有用项目的漂亮链接,但作为一个新的回答者,我仅限于两个......谷歌将不得不成为你其他人的指南。

希望这会有所帮助 - 祝你好运!

资源:

Html.RenderAction 和 Html.Action - http://haacked.com 博客

何时在 ASP.NET MVC Razor 视图中使用 Html.RenderPartial 和 Html.RenderAction - http://www.arrangeactassert.com

于 2012-08-02T17:03:45.857 回答