【问题标题】:how to create a view with multiple models mvc 4?如何创建具有多个模型 mvc 4 的视图?
【发布时间】:2013-04-25 15:40:12
【问题描述】:

所以我在 asp.net mvc 4 项目中工作,我的观点有问题,我想要创建一个具有 2 种不同类型模型的视图,第一个视图(索引)采用 IEnumerable(Models.myModel)第二个(订阅者详情)获取 Models.myModel,这是我的模型代码:

public class SubscribersModel
{

    [Required]
    [DataType(DataType.Text)]
    public string name { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [StringLength(maximumLength: 10, MinimumLength = 7)]
    public string cin { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime birthday { get; set; }

    [DataType(DataType.Text)]
    public string birthplace { get; set; }
  }

我的控制器代码:

 public class SubscribersController : Controller
{
    private AgencyDbEntities dbcontext = new AgencyDbEntities();
    private Subscribe sb = new Subscribe();

    public ActionResult Index()
    {
        var subscribers = from sb in dbcontext.Subscribes select new SubscribersModel {      cin = sb.cin, name = sb.name, birthday = (DateTime)sb.birthDay, birthplace = sb.birthPlace   };

        return View(subscribers);
    }

    public ActionResult Details(string id,string cin,string name)
    {
        var subscriber = new SubscribersModel();
        IEnumerable<Subscribe> list = from s in dbcontext.Subscribes select s;
        foreach (var sb in list)
        {
            if (sb.cin == id)
            {
                subscriber.cin = sb.cin;
                subscriber.name = sb.name;
                subscriber.birthday = (DateTime)sb.birthDay;
                subscriber.birthplace = sb.birthPlace;
            }
        }
        return View(subscriber);
    }
 }

我的索引视图:

  @model IEnumerable<_3SDWebProject.Models.SubscribersModel>

@{
    ViewBag.Title = "Subscribers";
}
    <div class="sidebar">
      //here i want to show my details view
     </div>
 <div class="content" style="width: 700px; margin-left: 250px; height: 545px;margin-  top: -30px;">
  <h2>Subscribers</h2>
<p>
     @Html.ActionLink("Create New", "Create")
</p>

 @Styles.Render("~/Content/css")
 <script src="@Url.Content("~/Scripts/Table.js")" type="text/javascript"></script>
 <table class="altrowstable" id="alternatecolor">
 <tr>
    <th>
        CIN
    </th>
    <th>
        Name
    </th>
    <th>
        birthday
    </th>
    <th>
        birthplace
    </th>
     <th class="operations">
        Operations
    </th>
</tr>

 @foreach (var item in Model)
{
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.cin)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.birthday)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.birthplace)
    </td>
    <td>
      @Html.ActionLink("Details", "Details", new { id = item.cin }, new { @class = "details-logo"})
     </td>
</tr>
}

</table>
</div>

我的详细信息视图:

@model _3SDWebProject.Models.SubscribersModel

<fieldset>
<legend>SubscribersModel</legend>

<div class="display-label">
     @Html.DisplayNameFor(model => model.name)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.name)
</div>
<div class="display-label">
     @Html.DisplayNameFor(model => model.birthday)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.birthday)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.birthplace)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.birthplace)
</div>
</fieldset>

如果有人有任何想法或解决方案,我将不胜感激: 注意:这张图片描述了我想要的

【问题讨论】:

  • 一个视图应该只与一个模型相关。您可以将两个模型合并为一个,并在视图中使用该组合模型。
  • 我不同意这一点。一个视图可以很好地,有时必须,根据需要与尽可能多的模型相关联。这就是为什么我使用我称之为“视图模型”的东西(即使它不是绝对正确的),模型和视图之间的一个类,来构建适当的内存结构,并将其传递给视图。但绝不可以将其命名为“模型”。请记住,如果您使用的是 EF Code First,创建“组合”新模型实际上会在数据库中生成一个新表。我怀疑这就是目标....

标签: asp.net-mvc entity-framework razor asp.net-mvc-4


【解决方案1】:

创建一个包含这两个视图模型的新复合视图模型。

public class CompoundViewModel
{
    public IEnumerable<SubscribersModel> AllSubscribers {get; set;} 
    public SubscribersModel SelectedSubscriber {get; set;}
}

理想情况下,还将您的视图拆分为部分视图,并使用DisplayFor&lt;&gt;EditorFor&lt;&gt; 将复合模型的这两个部分渲染到它们中。这样,如果需要,您可以在应用程序的其他地方重用“订阅者模型”的视图。

您的控制器代码也可以通过使用依赖注入框架(例如 Autofac)来注入您当前正在更新的那些依赖项来改进。

另一个替代方案,假设您对列表和详细信息视图使用相同的模型,将使用 Javascript 处理此客户端,手动使用 jQuery 或使用允许客户端模型的较新框架之一像 Knockout.js 或 Angular.js 这样的绑定。

【讨论】:

  • 感谢@lan,它工作得很好,我创建了一个包含两个模型的类。
【解决方案2】:

您只需要创建一个名为 Details 的第二个视图,它使用 SubscribersModel 进行强类型化

@model _3SDWebProject.Models.SubscribersModel

右键单击代码中的任意位置以执行 Details() 操作
选择添加视图...
为视图名称留下“详细信息”
选中“创建强类型视图”
从模型类下拉列表中选择您的 SubscribersModel
脚手架模板:详细信息
点击“添加”

【讨论】:

  • 我已经这样做了,问题是我不能在同一个视图中使用两种不同的模型类型
  • 哎呀,我看到你SS的左边了。
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多