在 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<plantationmvc.Models.CommModel>
传递到我的视图中时,它说它在命名空间中不存在。
【问题讨论】:
无法编译。你的真实代码是什么? @Amit 添加到控制器视图中;模型 sn-p 是我尝试添加第二个模型并编辑IEnumerable<string>
模型所做的。
【参考方案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<T1, T2>
。
控制器:
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
肯定会起作用,但我个人发现Item1
、Item2
、ItemX
在元组的消费者实际使用它的时候并没有什么帮助。
同意。它的可读性较差。但有时令人烦恼的是,在 C# 中,您必须为每个简单任务创建类型。所以Tuple
、Action
、Func
是很好的例子,你可以使用 .NET 类型而不必创建自己的类型。
我不确定我做错了什么。如何将每组 var
添加到控制器。我需要让视图返回(文件)但两个文件集。以上是关于在 1 个视图中添加 2 个 IEnumerable 模型的主要内容,如果未能解决你的问题,请参考以下文章
swift - 通过 prepareforsegue 在 2 个视图控制器之间添加值
是否可以在从基于类的视图返回的查询集中添加额外值(查询中的2个字段的计算)