1

我正在尝试过滤实体列表并使用过滤后的数据更新页面上的部分视图。部分视图返回带有过滤数据的正确模型,但未在父页面内呈现。相反,它在空 HTML 页面的“body”元素中呈现。我已经找到了很多关于此的主题,但即使我似乎遵循他们的指示,我仍然没有运气。来自社区的全新目光可能会带来巨大的帮助。

@model PennLighting.ViewModels.LinecardViewModel
@{
    ViewBag.Title = "Linecard";
}
<div class="linecard-head">
    @using (Ajax.BeginForm("Index",
        new AjaxOptions
        {
            UpdateTargetId = "linecard"
        }))
    {
        @Html.EditorFor(model => model.Categories)

        <div class="buttons">
            <input type="submit" name="btnFilter" value="Filter" />
            <input type="submit" name="btnShowAll" value="Show All" />
        </div>
    }
</div>
<div id="linecard">
    @Html.Partial("Linecard")
</div>
@section Scripts
{
    @Scripts.Render("~/bundles/jqueryval")
}

public ActionResult Index()
{
    var viewModel = new LinecardViewModel();
    viewModel.Categories = db.Categories
        .OrderBy(c => c.Name).ToList();
    viewModel.Manufacturers = db.Manufacturers
        .OrderBy(m => m.Name).ToList();
    return View(viewModel);
}

public ActionResult Index(string btnFilter, string[] selectedCategories)
{
    var viewModel = new LinecardViewModel();
    var selectedMfrs = new List<Manufacturer>();
    if (btnFilter != null && selectedCategories != null)
    {
        var categoryIds = selectedCategories.Select(c => int.Parse(c)).ToArray();
        if (categoryIds != null)
        {
            selectedMfrs = db.Manufacturers
                .Where(m => m.Categories.Any(c => categoryIds.Contains(c.ID)))
                .OrderBy(m => m.Name).ToList();
        }
    }
    else
        selectedMfrs = db.Manufacturers.OrderBy(m => m.Name).ToList();
    viewModel.Manufacturers = selectedMfrs;
    return PartialView("Linecard", viewModel);
}

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/themes/base/css", "~/Content/css")
</head>
<body>
    <div id="container" class="round-bottom">
        <div id="header">
            <div id="header-left">
                <div id="logo">
                    <a href="@Url.Content("~/")">
                        <img src="@Url.Content("~/Content/Images/logo.png")" alt="Penn Lighting Associates" /></a>
                </div>
            </div>
            <div id="header-right">
                <ul class="nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "Index", "About")</li>
                    <li>@Html.ActionLink("Linecard", "Index", "Linecard")</li>
                    <li>@Html.ActionLink("Events", "Index", "Events")</li>
                    <li>@Html.ActionLink("Gallery", "Index", "Gallery")</li>
                    <li>@Html.ActionLink("Contact", "Index", "Contact")</li>
                    <li><a href="http://oasis.pennlighting.com:81/OASIS/desk/index.jsp" target="_blank">
                        Customer Login</a></li>
                </ul>
            </div>
        </div>
        <div id="main">
            @RenderBody()
        </div>
    </div>
    <div id="footer">
        <p>
            Copyright &copy; 2008 Penn Lighting Associates</p>
    </div>
    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts",false)
</body>
</html>

那么我错过了什么?谢谢!

4

3 回答 3

0

The problem was that my jqueryval bundle was missing the jquery.unobtrusive-ajax.js file. My code works as is once that was included.

于 2013-07-08T10:01:16.407 回答
0

没有看到更多您的解决方案,它有点模糊,但我相信您仍然希望返回索引并将模型数据传递到您视图中的 Partial 中。你这样做的方式只会返回部分视图,这就是你得到这些结果的原因。

所以在过滤后的索引中:

return View(viewModel)

在索引视图中,将数据传递给部分,我假设没有看到有正确的模型关联来显示。

更新

如果您希望动态拉取数据子集并保持其余部分不变,则使用过滤器信息执行 AJAX POST 到为部分视图指定的操作。获取数据结果并将它们放在 Linecard div 中。

发送数据的方式有很多种(通过 JSON 捆绑、序列化表单、单个数据点)。这里有些例子:

http://brandonatkinson.blogspot.com/2011/01/using-jquery-and-aspnet-mvc-to-submit.html

MVC ajax json 发布到控制器操作方法

于 2013-07-07T15:32:47.543 回答
0

在同一个 HTTP 动词上,您不能在同一个控制器上具有相同名称的 2 个操作。您可能想要装饰Index通过 AJAX 调用调用并返回具有[HttpPost]属性的部分操作的控制器操作:

[HttpPost]
public ActionResult Index(string btnFilter, string[] selectedCategories)
{
    ...
}
于 2013-07-07T15:38:31.840 回答