所以我正在开发我的第一个ASP.NET MVC 3应用程序,并且我用我们制作的各种Ice Creams向用户显示了一个jqGrid。选择其中一行后,我当前调用Url.Action("Details", "IceCream")
,最终创建一个IceCreamDetails视图模型,该模型包含一堆列表(例如,RelatedDesserts,HistoricData),并在我的Details.cshtml中执行类似的操作:< / p>
...
<div>
@foreach (var related in Model.RelatedDesserts)
{
@Html.Partial("_RelatedDessert", related)
}
</div>
...
这可行,但并不是那么好,所以我决定为那些RelatedDesserts做一个子网格更好,并提供一种方法来点击该网格中的一行以在另一个div中显示一个图像 - 所以排序一个主要细节图像的东西。遵循?
现在,我这样做是因为我觉得这是一个错综复杂的机制,并希望有人可以建议一种更好,更清洁的方式。基本上我已经取代了这个:
@Html.Action("SubGrid", RelatedDesserts)
对于上面的foreach循环,当然,它调用RelatedDesserts控制器上的SubGrid操作。这个动作是这样的:
public PartialViewResult SubGrid(int iceCreamID)
{
using (var db = new IceCreamEntities())
{
return PartialView(iceCreamID);
}
}
显示看起来像这样的SubGrid视图:
<table id="relatedGrid" cellpadding="0" cellspacing="0">
</table>
<div id="relatedPager" style="text-align: center">
</div>
<div id="relatedImage">
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#relatedGrid').jqGrid({
url: '@Url.Action("GridData", "RelatedDesserts", new {iceCreamID = @Model})',
...
并运行相关的甜点数据,创建一个结果并返回它:
return Json(result, JsonRequestBehavior.AllowGet);
并使用我的数据填充relatedGrid。
但感觉这并不是所有精简的,并且所有SubGrid片段正在做的是为GridData动作的结果提供目标但是我不确定如何组合这两个动作(SubGrid和GridData)使事情变得简单。我可能真的以错误的方式解决这个问题。我该如何简化和改进?
答案 0 :(得分:1)
这是我的建议:使用一个模型和一个视图。
让您的模型填充视图所需的所有数据:在将所有数据库调用发送到视图之前进行所有数据库调用。
然后在你的视图中,我们将其称为'详细信息',你可以进行HTML的所有迭代(表行等等...甚至多次迭代 - 不用担心,这就是Views for!),以及设置JavaScript。除非你看到自己在其他页面上使用它们,否则没有必要将它们分成部分视图。
有时您需要将内容分成Partials或Child Actions;比如当事情过于复杂或可重用时 - 但似乎并非如此。
在MVC中,简单会让你微笑。 :)
答案 1 :(得分:1)
你说这两个电话有点时髦是对的。然而,根据它的声音,我不认为你可以将所有子数据放入模型中,正如@cyrotello建议的那样。这可能是一个非常强大的模型,它会更复杂而不是更简单。
在这种情况下我要做的只是使用主jqGrid中的链接来启动一个JavaScript函数,该函数将通过$.get()
调用一个控制器操作来重新绑定就地子jqGrid特定于该子视图的简单模型。此结构不仅可以重新绑定该就地jqGrid,还可以填充您可能希望在该子子视图中拥有的任何其他支持元素。
最终,我认为您感知的复杂性与尝试 over - 使用MVC框架有关。听起来像是对页面进行简单的JavaScript操作可能会更容易。