【问题标题】:mvc multiple models in viewmvc 视图中的多个模型
【发布时间】:2016-12-26 20:12:24
【问题描述】:

我正在制作一个 MVC 应用程序。我正在创建一个使用 ViewModel 的视图,并在控制器传递的此视图中使用数据库实体。
控制器:

public ActionResult AddGroup(AddGroupViewModel model)
        {
            ClassDeclarationsDBEntities1 entities=new ClassDeclarationsDBEntities1();
            return View(entities.Subjects.ToList());
        }

视图模型:

public class AddGroupViewModel
{
    [Required]
    [Display(Name = "Subject")]
    public string subject_name { get; set; }

    [Required]
    [Display(Name = "Number of Groups")]
    public int qty { get; set; }
}

最后是我的观点:

@model List<ClassDeclarationsThsesis.Classes.Subject>
@model ClassDeclarationsThsesis.Models.AddGroupViewModel 

@{
    ViewBag.Title = "Add Groups";
}

<h2>Add Groups to subjects</h2>

@using (Html.BeginForm("AddGroup", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Create new groups.</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @{
            List<SelectListItem> listItems1 = new List<SelectListItem>();

        }
        @foreach (var subject in Model)
        {
            listItems1.Add(new SelectListItem
            {
                Text = subject.name,
                Value = subject.name,
                Selected = true
            });
        }
        @Html.LabelFor(m => m.subject_name, new {@class = "col-md-2 control-label"})
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.subject_name, listItems1, new {@class = "form-control"})
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.qty, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.qty, new { @class = "form-control" })
        </div>
    </div>


    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Submit" />
        </div>
    </div>
}

如您所见,在我看来,我正在尝试使用两个模型。但是给出了一个例外(以及如何区分它们)。如何在一个视图中组合这两个模型?
编辑:
所以我做了回答中的建议,但现在我得到了这样的例外:

{"The class 'ClassDeclarationsThsesis.Models.Subject' has no parameterless constructor."}

类如下所示:

namespace ClassDeclarationsThsesis.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Subject
    {
        private int v;
        private int userid;

        public Subject(int v, int userid, string name)
        {
            this.class_id = v;
            this.user_id = userid;
            this.name = name;
        }


        public int class_id { get; set; }
        public int user_id { get; set; }
        public string name { get; set; }

        public virtual Group Group { get; set; }
        public virtual Subjects_Users Subjects_Users { get; set; }
        public virtual Task Task { get; set; }
    }
}

我该如何解决?

【问题讨论】:

  • AddGroupViewModel 上创建List&lt;ClassDeclarationsThsesis.Classes.Subject&gt; 类型的属性?或者创建一个具有这两种类型属性的视图模型并使用它?您只能使用一种类型,但您可以根据需要自定义该类型。
  • @David 是的,但是我如何从数据库中获取传递的数据(在控制器中传递)?
  • 来自您已经拥有并已用于获取数据的entities 对象...
  • @David 请查看编辑
  • 这听起来像是一个单独的问题。实体框架是否抛出该异常?我一直认为 Entity Framework 类需要无参数的构造函数才能让框架使用它们,尽管我可能会误会。

标签: c# .net asp.net-mvc model-view-controller


【解决方案1】:

既然你已经有一个视图模型,我会使用它:

@model ClassDeclarationsThsesis.Models.AddGroupViewModel

然后只需为您还想使用的集合添加一个属性到该视图模型:

public class AddGroupViewModel
{
    [Required]
    [Display(Name = "Subject")]
    public string subject_name { get; set; }

    [Required]
    [Display(Name = "Number of Groups")]
    public int qty { get; set; }

    public List<Subject> Subjects { get; set; }
}

然后只需从您的控制器创建一个实例以发送到视图:

var entities = new ClassDeclarationsDBEntities1();
var model = new AddGroupViewModel();
model.Subjects = entities.Subjects.ToList();
// set your other properties too?
return View(model);

然后,当您需要该集合时,只需在视图中引用 Model 上的属性而不是模型本身:

@foreach (var subject in Model.Subjects)

基本上,虽然您的模型只能使用一种类型(因为框架中的视图只有一个 Model 属性可用),但该类型可以是您喜欢的任何类型,甚至是您定义的自定义视图模型类型.

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多