2016-12-26 94 views
-1

我正在製作一個MVC應用程序。我正在創建一個使用ViewModel的視圖,並且在該視圖中使用由控制器傳遞的數據庫實體。
控制器:mvc多個模型的視圖

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; } 
    } 
} 

如何解決這個問題呢?

+0

在'List '類型的'AddGroupViewModel'上創建屬性?或者創建一個具有這兩種類型屬性的視圖模型並使用它?您只能使用一種類型,不過您可以自定義該類型。 – David

+0

@David是的,但我如何從數據庫傳遞數據(通過控制器傳遞)? –

+0

從你已經擁有並且已經用來獲取數據的「實體」對象... – David

回答

2

既然你已經有一個視圖模型,我會使用:

@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; } 
} 

然後在視圖SIMP

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

:然後簡單地從你的控制器創建者的一個實例發送到視圖LY是指在Model而不是模型本身的屬性,當你需要收集:

@foreach (var subject in Model.Subjects) 

基本上,當你可以只用一個類型模型(因爲只有一個Model財產是在視圖該框架),該類型可以是任何你喜歡的,甚至是你定義的自定義視圖模型類型。