我在局部视图中定义了一个 webgrid。(这是一个 MVC 4 项目。) webgrid 不是局部视图中唯一的东西,因此 webgrid 绑定到局部视图模型中的一个列表。
当单击列标题时,网格会按应有的方式填充和排序,但是当我通过调用操作方法(通过使用 Ajax.BeginForm 设置的表单帖子)重新填充网格,然后单击列标题时,网格内容消失。(action 方法使用用户在表单上提供的搜索条件查询数据库。)
这可能是什么原因造成的?如何解决?
部分视图开始于:
@model DonationImport.Models.GiftWithSplits
部分视图的内容在由以下指定的形式内:
@using (Ajax.BeginForm("SearchConstit", "Batch", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "constitSearchArea" }))
WebGrid 定义如下:
@{
var constitGrid = new WebGrid(source: Model.SearchResults, rowsPerPage: 100, ajaxUpdateContainerId: "constitGrid");
<div style="overflow-x: scroll; width: 100%;">
<div style="width: 1910px;">
@constitGrid.GetHtml(htmlAttributes: new { id = "constitGrid" },
columns: constitGrid.Columns(
constitGrid.Column(format: @<text><button onclick="selectConstituent('@item.Constituent_ID')" >select</button></text>, style: "searchResultsColumnWidth"),
constitGrid.Column("Constituent_ID", header: "ConstitID", style: "searchResultsColumnWidth", format: @<text>@Html.ActionLink((string)item.Constituent_ID, "PriorGifts", new { constitID = item.Constituent_ID }, new { target = "Prior Payments" })</text>),
constitGrid.Column("IsActive", header: "Active", style: "searchResultsColumnWidth"),
constitGrid.Column("LastName", header: "Last", style: "searchResultsColumnWidth"),
constitGrid.Column("FirstName", header: "First", style: "searchResultsColumnWidth"),
constitGrid.Column("MiddleInitial", header: "M.I.", style: "searchResultsNarrowColumnWidth"),
constitGrid.Column("Spouse", header: "Spouse", style: "searchResultsColumnWidth"),
constitGrid.Column("EmailAddress", header: "E-mail", style: "searchResultsWideColumnWidth"),
constitGrid.Column("AddressLine1", header: "Address Line 1", style: "searchResultsWideColumnWidth"),
constitGrid.Column("City", header: "City", style: "searchResultsWideColumnWidth"),
constitGrid.Column("State", header: "State", style: "searchResultsColumnWidth"),
constitGrid.Column("Zip", header: "Zip", style: "searchResultsWideColumnWidth"),
constitGrid.Column("SearchResultsText", header: "Search Results", style: "searchResultsWideColumnWidth"),
constitGrid.Column("IsActivePledge", header: "Pledge", style: "searchResultsNarrowColumnWidth"),
constitGrid.Column("ReceiptWarning", header: "Receipt Warning", style: "searchResultsWideColumnWidth"),
constitGrid.Column("IsMember", header: "Mbr", style: "searchResultsNarrowColumnWidth")),
alternatingRowStyle: "altrow")
</div>
</div>
}
单击时:
<input type="submit" value="Search" />
在表单中,调用的action方法如下:
[HttpPost]
public PartialViewResult SearchConstit(DonationImport.Models.GiftWithSplits g)
{
GiftWithSplits giftWithSplits = new GiftWithSplits(); // model (object) to be returned to the partial view
// send back gift data which we are currently using
giftWithSplits.GiftToVerify = g.GiftToVerify;
// search using provided data
string middleInitial = empty2null(g.GiftToVerify.SourceMiddleName);
if (!string.IsNullOrWhiteSpace(middleInitial))
middleInitial = middleInitial.Substring(0, 1); // just supply the initial, not the entire name
string zip = empty2null(g.GiftToVerify.SourceZip);
if (!String.IsNullOrWhiteSpace(zip))
zip = zip.Substring(0, 5); // we want only the first 5 digits of the zip
giftWithSplits.SearchResults = db.SearchDonor(null, g.GiftToVerify.DonationSourceCode, empty2null(g.SourceAcctMemo), null, empty2null(g.GiftToVerify.SourceLastName),
empty2null(g.GiftToVerify.SourceFirstName), middleInitial, empty2null(g.GiftToVerify.SourceAddress1),
empty2null(g.GiftToVerify.SourceCity), empty2null(g.GiftToVerify.SourceState), zip, empty2null(g.GiftToVerify.SourceCountry),
empty2null(g.GiftToVerify.SourceEmailAddress), empty2null(g.GiftToVerify.SourcePhone)).ToList();
if (giftWithSplits.SearchResults.Count == 0)
{
SearchDonor_Result emptyResult = new SearchDonor_Result();
emptyResult.Constituent_ID = "[None Found]";
giftWithSplits.SearchResults.Add(emptyResult);
}
return PartialView("_ConstitSearch", giftWithSplits);
}
您可能会说,我是这种 MVC 方法的初学者。
其他想法(稍后添加)...
问题的根源似乎是 WebGrid HTML 帮助为列标题生成的链接是基于与生成网格的操作方法相关的 URL。首次显示网格时,链接为:/Batch/Verify/34?sort=FirstName&sortdir=ASC,因为网格是作为整个验证视图的一部分构建的(来自验证操作方法)。但是,当搜索手动输入的搜索条件时,网格是从仅填充部分视图的 SearchConstit 操作方法构建的,因此列标题链接中的 URL 现在是:/Batch/SearchConstit?sort=FirstName&sortdir=ASC。
此外,“搜索”按钮与 POST 相关联,因为它需要从表单字段传递数据以用作搜索条件;然而,WebGrid 列标题使用的是 GET,显然没有办法强制它们发布。因此,问题似乎归结为如何在不发布表单的情况下从表单字段传递搜索条件。
我可以想到一个使用 Session 变量的可能解决方案,但我很犹豫这样做。
另一种选择可能是放弃使用 WebGrid。
有任何想法吗?