回答

收藏

将多个结果集从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等网站这样做的方式。它们还允许进行其他过滤(类别仅是顶层)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则