2016-05-23 12 views
2

Theres verbindet bereits, wie man mehrere Modelle für eine Ansicht mit verschiedenen Wegen benutzt, aber ich versuchte diese und konnte sie nicht zur Arbeit bringen, was mache ich falsch?MVC5 Kann nicht zwei Modelle in einer Ansicht verwenden

ich einfach mal zwei Formulareingaben in 1 Aufruf, und ein Modell, sondern eine der Formulareingaben verwendet eine Liste < ‚Modell‘> und die anderen Verwendungen ‚Modell‘, hier ist was ich meine:

UPDATE : Kopieren/fügen Sie diesen Code ein, wenn Sie alle Checkbox-Elemente auswählen und senden, erhalten Sie einen Fehler bei @ Model.input.passWord und ich habe keine Ahnung, warum Checkbox-Elemente auch nicht angezeigt werden, brauchen Hilfe.

View (Index.cshtml): 

@using stupidassTests.Models 
@model MyViewModel 


@{ 
ViewBag.Title = "Index"; 


} 

<h2>Password Input</h2> 

<div> 
<p>Enter Password</p> 
@using (Html.BeginForm("Index", "Home", FormMethod.Get)) 
{ 
    @Html.TextBox("password") 

    <button type="submit" value="Search"></button> 
} 

<p>@Model.input.passWord</p> <!--passWord is underlined with red because it conflicts with the List'model'--> 

</div> 

<h2>Checkbox</h2> 

<div> 

@using (Html.BeginForm()) 
{ 
    for (var i = 0; i < Model.inputCollection.Count; i++) 
    { 
     <p> 
      @Html.HiddenFor(n => n.inputCollection[i].Id) 
      @Html.DisplayFor(n => n.inputCollection[i].Name) 
      @Html.HiddenFor(n => n.inputCollection[i].Name) 
      @Html.CheckBoxFor(n => n.inputCollection[i].Checked) 
     </p> 

    } 

    <input id="Submit1" type="submit" value="submit" /> 


    if (ViewBag.Values != null) 
    { 
     foreach (var item in ViewBag.Values) 
     { 
      <p>@item</p> 
     } 
    } 



} 

So wie Sie sehen können, kopieren/meinen Code einfügen und versuchen, sie auszuführen, ‚password‘ Formulareingabe wird durch ‚Checkbox‘ Eingang schob aus, so scheint es, die beiden ‚@model "Sind unter einer Modellklasse Konflikte, wie kann ich das beheben?

Controller (HomeController.cs):

public Action Index() {

 return View(); 
    } 



    [HttpGet, ActionName("Index")] 
    public ActionResult PasswordInput(string password) 
    { 
     FormInputs pss = new FormInputs(); 

     pss.passWord = password; 

     MyViewModel mvm = new MyViewModel() { input = pss, isList = false }; 

return this.View("Index", mvm); 

    } 





    [HttpGet] 
    public ActionResult CheckBoxGet() 
    { 


     var list = new List<FormInputs> 
     { 
      new FormInputs { Id = 1, Name = "Aquafina", Checked = false }, 
     new FormInputs { Id = 2, Name = "Mulshi Springs", Checked = false }, 
     new FormInputs { Id = 3, Name = "Alfa Blue", Checked = false }, 
     new FormInputs { Id = 4, Name = "Atlas Premium", Checked = false }, 
     new FormInputs { Id = 5, Name = "Bailley", Checked = false }, 
     new FormInputs { Id = 6, Name = "Bisleri", Checked = false }, 
     new FormInputs { Id = 7, Name = "Himalayan", Checked = false }, 
     new FormInputs { Id = 8, Name = "Cool Valley", Checked = false }, 
     new FormInputs { Id = 9, Name = "Dew Drops", Checked = false }, 
     new FormInputs { Id = 10, Name = "Dislaren", Checked = false }, 

}; 
     MyViewModel mvm = new MyViewModel() { inputCollection = list, isList = true }; 
return this.View("Index", mvm); 

    } 


    [HttpPost] 
    public ActionResult CheckBoxPost(List<FormInputs> list) 
    { 


     var selected = list.Where(x => x.Checked).Select(x => x.Name); 

     ViewBag.Values = selected; 

     MyViewModel mvm = new MyViewModel() { inputCollection = list, isList = true }; 

     return this.View("Index", mvm); 
    } 

Model (FormInputs.cs):

public class MyViewModel 
{ 
    public FormInputs input; 
    public List<FormInputs> inputCollection; 
    public bool isList; 
} 
public class FormInputs 
{ 
    public string passWord = ""; 


    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Checked { get; set; } 

    public List<string> checkBox = new List<string>(); 


} 

Also nur als Zusammenfassung, weil Ich bin ein Anfänger bei MVC, wie überarbeite ich diesen Code (btw kopieren/einfügen), so dass beide Formulareingaben in einer Ansicht koexistieren können?

+3

Erstellen Sie einfach einen Blick Modell mit 2 Eigenschaften mit - 'FormInputs Property1' und' Liste Property 2' –

+2

Von meinem Wissen können Sie in einem einzigen mehrere Modelle haben nicht Ansicht in MVC. Sie sollten dynamische Modelle oder ViewModel-Muster verwenden, um dies zu erreichen. http://stackoverflow.com/questions/5550627/two-models-in-one-view-in-asp-mvc-3 könnte Ihnen helfen. – geo

+0

Aber was ist der Sinn? Du kannst nur ein Formular nach dem anderen posten –

Antwort

1

Sie können viewmodel verwenden.

Verwenden Ansichtsmodell

Für View-Modell Sie haben eine Klasse zu erstellen und in dieser Klasse definieren Sie alle Modelle als Eigenschaften dieses class.Here sind zwei Klassen.

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

} 

public class Employee 
{ 
    public int Id { get; set; } 
} 

Hier ist Ansichtsmodell

public class ViewModel 
{ 
    public Employee emp { get; set; } 
    public EmployeeDetails empdet{ get; set; } 
} 

Jetzt in-Controller wird gefällt Ihnen diese

public ActionResult About() 
{ 
     ViewModel vm = new ViewModel(); 
     vm.emp = new Employee(); 
     vm.empdet = new EmployeeDetails(); 
     return View(vm); 
} 

Und im Blick werden Sie es wie diese

@model ViewModel 
+0

Wie integriere ich ActionResult Checkbox()? –

1

Dies könnte erhalten ein gutes Beispiel für die Verwendung der 012 sein.Sie können ein Ansichtsmodell mit zwei Eigenschaften haben:

public class MyViewModel{ 
    public FormInputs input; 
    public List<FormInputs> inputCollection; 
    public bool isList; 
} 

Und die Daten entsprechend arrangieren:

public ActionResult PasswordInput(string password) 
{ 
    FormInputs pss = new FormInputs(); 

    pss.passWord = password; 

    MyViewModel mvm = new MyViewModel(){input = pss, isList = false} 
    return this.View("Index", mvm); 
} 

UND

public ActionResult CheckBoxGet() 
{ 
    var list = new List<FormInputs> 
    { 
     new FormInputs { Id = 1, Name = "Aquafina", Checked = false }, 
    new FormInputs { Id = 2, Name = "Mulshi Springs", Checked = false }, 
    new FormInputs { Id = 3, Name = "Alfa Blue", Checked = false }, 
    new FormInputs { Id = 4, Name = "Atlas Premium", Checked = false }, 
    new FormInputs { Id = 5, Name = "Bailley", Checked = false }, 
    new FormInputs { Id = 6, Name = "Bisleri", Checked = false }, 
    new FormInputs { Id = 7, Name = "Himalayan", Checked = false }, 
    new FormInputs { Id = 8, Name = "Cool Valley", Checked = false }, 
    new FormInputs { Id = 9, Name = "Dew Drops", Checked = false }, 
    new FormInputs { Id = 10, Name = "Dislaren", Checked = false }, 

    }; 
    MyViewModel mvm = new MyViewModel(){inputCollection = list , isList = true} 
    return this.View("Index", mvm); 

} 

und in Anbetracht, verwenden Sie diese:

@model MyViewModel 

Überprüfen Sie die isList Eigenschaft vor der Eingabe/inputCollection

+0

bekommen mehrdeutige Ausnahmen, aber im Code zeigt es 0 Fehler, Hilfe! –

+0

Wo bekommen Sie die Ausnahmen? – SamGhatak

+0

Die aktuelle Anforderung für die Aktion 'Index' auf Controller-Typ 'HomeController' ist mehrdeutig zwischen den folgenden Aktionsmethoden: System.Web.Mvc.ActionResult PasswordInput (System.String) auf den Typ dolidassTests.Controllers.HomeController System.Web.Mvc .ActionResult CheckBoxGet() beim Typ dothelassTests.Controllers.HomeController –

Verwandte Themen