将多个结果集从ASP.NET MVC中的控制器传递到视图?
技术问答
363 人阅读
|
0 人回复
|
2023-09-14
|
所以我有一个控制器设置如下:! y8 s8 P+ z6 u0 h8 D
using NonStockSystem.Models;
8 m5 i f, z0 z0 o8 Ynamespace NonStockSystem.Controllers
" S9 s1 H. |: V& |6 o" G{* c! Z; P) h* {' h
[Authorize(Users = "DOMAIN\\rburke")]
# M4 O& G% \5 N) l4 W: k public class AdminController : Controller) l( K( i3 ]* A( f8 B& D: j9 e
{
/ h+ f+ [$ ?1 M U) k private NonStockSystemDataContext db = new NonStockSystemDataContext();
' k: ]& l! j* _1 o$ E public ActionResult Index()6 ^3 M. A( N7 p5 l
{( }3 t9 {3 ^/ Y$ K
var enumProducts = from p in db.Products select p;+ Q* @) _( }; q# F0 F S
ViewData["Title"] = "Administration";& S; p' y8 Y( |5 |& A
return View(enumProducts.ToList());1 S& M( G Y z# K! t8 p- O; d) e
}* b* u% t9 `% G- b
}
/ V$ ?+ t1 s ?. T, Y4 v}
: G, [% {& f. L6 m' K" l/ T% @0 ~% {* C/ c管理控制器上的“索引”视图仅列出系统中的产品,并允许我们单击产品以查看/编辑/删除该产品。真的很简单。但是,每个产品都有一个CategoryID,该ID告诉我们该产品属于哪个类别,存储在单独的表中。
/ \0 b8 L& f" I+ Z1 O8 N2 U4 C(非常简化的)当前视图是这样的:8 r& E1 R. e5 ]0 m- C
6 k4 C+ {% K! {( a" L9 }2 E' q
, v7 d% o. E5 I4 ]/ n, u2 X$ C
1 c8 R) |# m4 X, M$ B
(Edit - Delete)
4 C3 M! u! ]3 ~ O6 J. t$ t7 g! X& q' E; o6 |/ r. S
3 z) x, @! d. u) R
$ p3 X# A2 _9 ] v目前这很好,因为在我开发和测试该系统时,系统中只有10或15种产品,但是一旦我部署它,大约就会有。数据库中有300种产品。我可以将它们全部显示在一页上,但是我想使用(a
* c5 V8 z& C: y |% S8 Ehref- C/ y8 \' c0 e ?0 O( r
=“#category”)链接,就像Wikipedia一样,因此在页面顶部,我可以获得类别列表,当您单击时它会将您带到页面的相应部分。因此,在这种情况下,我的观点将如下所示:- f) o6 _2 r7 J0 X2 J" ]
, t1 r3 T2 u9 |3 E8 x5 ^; o d/ ?, t! X4 ]. `" N# C' q9 m' X
: K3 E$ ^8 r$ \2 c 9 ^( V7 k$ v$ J
. J( R+ M* j0 ^
9 f: Y; r( `! S
- |" r( x% D N% Q& u
- a6 L( \, e2 Z8 X3 z% z' d, x ">2 X; k2 X* q/ |/ [* i+ \" ?7 _
+ J8 S& n0 k7 {
(Edit - Delete)
I% @3 a3 S [! Q: _1 H4 {, A 3 B) h3 c8 Y8 [, k( k! e
} %>) z# Y* ]5 {- d* e; q2 F6 S
& T, L! U* X! U. D& ~3 g; d( M首先,我不完全确定这是执行此操作的“正确”方法,因此,我绝对乐于接受有关其他处理方法的建议,但是如果这是可行的方法,那么我需要知道如何做(1
+ @0 O& Y3 D2 q1 \: ~)将两个结果集传递到视图(产品和类别),并且(2)在每个foreach循环中通过产品的子集循环,从而仅获取适当类别中的产品? C( U& U5 f7 Q0 X2 W
干杯!
R# @) v& j' U4 F2 T0 n6 R 2 L# ?& S: b2 V9 S* H
解决方案:- l3 J. d# Y- H9 z# C! x& ^& ~
P& u4 q& Z- f
) c; v! Y4 ?! n* w0 g7 }7 K9 \+ n. P& Y; G: t: W
您有两种选择。首先,您可以创建一个仅包含产品和类别集合的仅查看模型。其次,您可以在ViewData中传递一个或两个模型,而不是将其设置为页面的Model。
: @! T6 H7 l) @1 ?6 j* epublic class CategoryProduct! K9 @& h5 D& v1 d+ j1 I
{
2 q; C3 w$ v! f# r8 T public IEnumerable Products { get; set; }
+ m! O0 W4 T/ \3 S# d# q public IEnumerable Categories {get; set; }
8 a2 t) v# ?& W- R" d& L}
7 L2 o( ^6 s J: Z...., Y2 g3 e/ ~8 Q5 u, X6 n; O8 ^- C
return View( new CategoryProduct { Products = products,
& ?; [/ S2 F) x Categories = categories } );4 `/ `& j# I" M. e1 t( G/ v
这使您可以使用强类型视图模型并获得智能感知,但需要额外维护一个类。+ \, e x+ u3 }1 J4 Z. |; D
或(一个选项)
! F0 k2 ]/ _, e+ V$ iViewData["categories"] = categories;
4 @: C* D. ^' creturn View( products );
" ?( `9 k+ \8 V! L这需要强制转换类别的ViewData,以便您可以使用强类型输入。在这种情况下,产品就是模型。您可以交换它们,也可以将两者都放在ViewData中。
5 ?) @9 O/ ~( c: t% e$ `0 f至于您的方法,我可以接受。一种替代方法是使其分页,以便并非所有类别都存在于同一页面上,以缩短页面长度。您仍然会在顶部列出所有类别,但是有些类别可能需要回发才能获取新的数据页面。这可能有点复杂,但是当产品数量增加时,它将加快加载时间。另一种方法是使用向下钻取。首先选择一个类别,然后仅显示该类别中的产品。这些也可以分页。我认为这通常是Amazon,Buy.com等网站这样做的方式。它们还允许进行其他过滤(类别仅是顶层)。 |
|
|
|
|
|