在 1 个视图中添加 2 个 IEnumerable 模型

Posted

技术标签:

【中文标题】在 1 个视图中添加 2 个 IEnumerable 模型【英文标题】:adding 2 IEnumerable models in 1 view 【发布时间】:2015-10-30 05:00:58 【问题描述】:

我创建了一个使用 1 个视图成功运行的视图

@model IEnumerable<string>
<ul>
    @foreach (var fName in Model)
    
        var name = fName;
        var link = @Url.Content("~/Content/archives/mgamm/") + name.Replace(" ", "%20");

        <li style="list-style:none; font-size:1.2em;">
            <a href="@link">@name</a>
        </li>
    
</ul>
@if (User.IsInRole("admin"))

    <div>
        @using (html.BeginForm("Index", "Archives", FormMethod.Post, new  enctype = "multipart/form-data" ))
        
            <input type="File" name="file" id="file" value="Choose File" />
            <button type="submit">Upload</button>
        
    </div>

使用控制器

namespace plantationmvc.Controllers

    public class ArchivesController : Controller
    
        //
        // GET: /Archives/
        public ActionResult Index()
        
            var path = Server.MapPath("~/Content/archives/mgamm");

            var dir = new DirectoryInfo(path);

            var files = dir.EnumerateFiles().Select(f => f.Name);

            return View(files);
        

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        
            var path = Path.Combine(Server.MapPath("~/Content/archives/mgamm"), file.FileName);

            var data = new byte[file.ContentLength];
            file.InputStream.Read(data, 0, file.ContentLength);

            using (var sw = new FileStream(path, FileMode.Create))
            
                sw.Write(data, 0, data.Length);
            

            return RedirectToAction("Index");
        
    


但是,我想在同一页面上添加另一个类似的 sn-p,但内容路径不同。

如何向此页面添加另一个模型?

我只有一个控制器和一个视图,所以我创建了一个 ViewModel 并创建了 2 个类

namespace plantationmvc.Models

    public class ArchivesViewModel
    
        public CommModel Model1  get; set; 
        public MeetModel Model2  get; set; 
    

    public class CommModel
    
        public IEnumerable<CommModel>              
    
    public class MeetModel 
    
        public IEnumerable<MeetModel>
    

当我尝试将其作为@model IEnumerable&lt;plantationmvc.Models.CommModel&gt; 传递到我的视图中时,它说它在命名空间中不存在。

【问题讨论】:

无法编译。你的真实代码是什么? @Amit 添加到控制器视图中;模型 sn-p 是我尝试添加第二个模型并编辑 IEnumerable&lt;string&gt; 模型所做的。 【参考方案1】:

 public class ArchivesViewModel
 
    public IEnumerable<CommModel> Model1  get; set; 
    public IEnumerable<MeetModel> Model2  get; set; 
 

 public class CommModel
 
    //properties of CommModel 

 
 public class MeetModel 
 
   //properties of Meet Model
 

 

并添加视图@model plantationmvc.Models.ArchivesViewModel

【讨论】:

我是否可以在 CommModel 属性中添加 public ActionResult Index() var,就好像它是另一个控制器一样?和return (View) 您应该只将索引视图所需的数据添加到 viewModel 一直很忙,但又重新审视这个问题,我会对控制器进行哪些更改?我是否将控制器上的必要数据移动到模型中? 是的数据属于模型,您可以组合多个模型将它们发送到视图。控制器仅处理请求和更新模型或持久性到数据库的地方,或者您可以创建服务类以获得瘦控制器 【参考方案2】:

您的模型需要任何类型,其中包含两个集合。

它可以是你的类型(例如上面答案中的ArchivesViewModel),或者你甚至可以使用Tuple&lt;T1, T2&gt;

控制器:

public ActionResult Index()

    var list1 = new[]  "1", "2", "3", "4", "5" ;
    var list2 = new[]  "10", "20", "30", "40", "50" ;
    var model = Tuple.Create<IEnumerable<string>, IEnumerable<string>>(list1, list2);
    return View(model);

查看Index.schtml

@model Tuple<IEnumerable<string>, IEnumerable<string>>

@foreach (var a in Model.Item1)

    <h2>@a</h2> 

@foreach (var b in Model.Item2)
 
    <h3>@b</h3>

【讨论】:

虽然Tuple 肯定会起作用,但我个人发现Item1Item2ItemX 在元组的消费者实际使用它的时候并没有什么帮助。 同意。它的可读性较差。但有时令人烦恼的是,在 C# 中,您必须为每个简单任务创建类型。所以TupleActionFunc 是很好的例子,你可以使用 .NET 类型而不必创建自己的类型。 我不确定我做错了什么。如何将每组 var 添加到控制器。我需要让视图返回(文件)但两个文件集。

以上是关于在 1 个视图中添加 2 个 IEnumerable 模型的主要内容,如果未能解决你的问题,请参考以下文章

1 个屏幕的最佳方法包含 2 个视图控制器

swift - 通过 prepareforsegue 在 2 个视图控制器之间添加值

子容器视图中的 UILabel 未更新

是否可以在从基于类的视图返回的查询集中添加额外值(查询中的2个字段的计算)

Django - 如果我在视图中将 2 个表单集放在一起,则添加多次相同视图的功能不起作用

将项目添加到另一个活动中的列表视图(仅添加 1 个条目)