0

我有 3 张桌子:

速率配置文件

  • RateProfileID
  • 个人资料名称

速度

  • 费率ID
  • RateProfileID
  • 面板ID
  • 其他要更新的东西

控制板

  • 面板ID
  • 面板名称

我有这些模型。我有一个使用 RateProfile 模型的编辑页面。我显示 RateProfile 的信息以及与之关联的所有 Rates。这很好用,我可以很好地更新它。但是,我还添加了一个下拉列表,以便我可以按 PanelID 过滤费率。我需要它来回发更改,以便它可以显示过滤后的费率。

我在用着

@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })

对于我的下拉列表。每当它回发到我的 HttpPost Edit 方法时,它似乎都缺少有关 Rates 导航属性的所有信息。这很奇怪,因为我认为它会完全按照我在表单中的输入/提交按钮所做的事情(实际上将整个模型传递回我的 HttpPost 编辑操作并执行我想要它执行的操作)。panelID 正确地传递给我的 HttpPost Edit 方法并传递到下一个视图,但是当我尝试查询 Model.Rates 导航属性时为空(仅当帖子来自下拉列表时。当帖子来自时一切正常我的提交输入)。

获取编辑:

    public ActionResult Edit(int id, int panelID = 1)
    {

        RateProfile rateprofile = db.RateProfiles.Single(r => r.RateProfileID == id);
        var panels = db.Panels;

        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;

        return View(rateprofile);
    }

HttpPost 编辑:

    [HttpPost]
    public ActionResult Edit(RateProfile rateprofile, int panelID)
    {
        var panels = db.Panels;
        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;
        if (ModelState.IsValid)
        {
            db.Entry(rateprofile).State = EntityState.Modified;

            foreach (Rate dimerate in rateprofile.Rates)
            {
                db.Entry(dimerate).State = EntityState.Modified;
            }
            db.SaveChanges();
            return View(rateprofile);
        }
        return View(rateprofile);
    }

看法:

@model  PDR.Models.RateProfile
@using (Html.BeginForm(null,null,FormMethod.Post, new {id="RateForm"}))
{
    <div>
        @Html.Label("Panel")
        @Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
    </div>
    @{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
    @for (int i = 0; i < rates.Count; i++)
        {
            <tr>
                <td>
                    @Html.HiddenFor(modelItem => rates[i].RateProfileID)
                    @Html.HiddenFor(modelItem => rates[i].RateID)
                    @Html.HiddenFor(modelItem => rates[i].PanelID)

                    @Html.EditorFor(modelItem => rates[i].minCount)
                    @Html.ValidationMessageFor(model => rates[i].minCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].maxCount)
                    @Html.ValidationMessageFor(model => rates[i].maxCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].Amount)
                    @Html.ValidationMessageFor(model => rates[i].Amount)
                </td>
            </tr>
        }
     <input type="submit" value="Save" />
}

总结一下我的问题,我认为以下查询仅在帖子来自提交按钮时有效,而不是来自我的下拉列表时。

@{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
4

3 回答 3

0

它在呈现的页面中看起来如何?您可能有两个元素以相同的名称/ID 呈现:

 @Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()"

@Html.HiddenFor(modelItem => rates[i].PanelID)
于 2012-06-24T15:25:58.920 回答
0

我建议您使用 Firefox/Firebug 来检查它正在发出的实际请求。我无法想象如果通过提交与按钮触发表单会以不同的方式发布,但我想这是可能的。

在更大的范围内,我会对您的设计发表一些评论。

  1. 我会为您的选择使用 ViewBag 属性,而不是对 ViewData 进行基于键的访问。这将在您的控制器和视图中更具可读性。

  2. 考虑有一个单独的操作来填充由下拉列表过滤的信息。根据 PanelID 在您的视图中呈现该操作,并通过 AJAX 调用该操作以获取新的 HTML,而不是执行完整的表单发布。

  3. 避免在标记中应用处理程序。相反,将可选的脚本部分添加到您的母版页,并在需要时将脚本添加到您的页面,以通过该部分应用您的行为。这允许您通过主控器控制特定于视图的脚本在文档中的放置位置,并使您的行为与文档结构分开,这是可读性的最佳实践。

于 2012-06-24T15:27:58.247 回答
0

我发现了问题。看起来是因为我只循环了我的导航属性的一个子集(按 panelID 过滤的速率),从视图返回的模型只有导航属性的子集可供它使用。保存更改后,我刚刚重新定义了我的模型(再次从数据库中调用记录),现在看起来不错。

IE。我的导航属性中应该有 140 条记录,通过 panelID == 1 过滤将其缩小到 28 条记录。由于某种原因,实体框架决定它不想维护与其他 112 条记录的关系,所以当我将下拉列表更改为按 panelID == 2 过滤时,唯一可用的记录都有 panelID == 1 并返回 null .

于 2012-06-25T17:19:12.873 回答