2010-11-28 11 views
1

Hey, ich arbeite an einem Helpdesk in MVC2, und ich habe ein Problem mit Daten, die nicht aus meinen Ansichten über meine ViewModels übertragen werden.Warum werden in meinem ViewModel keine Daten übertragen?

Auf der Startseite habe ich drei DropDownLists, aus denen Sie einen Problembereich auswählen können. Sie können dann eine Taste drücken, um entweder ein Problem zu melden oder die FAQ aufzurufen. Wenn Sie einen Problembereich in den DropDownLists auswählen, sollte sich die Site daran erinnern, was Sie ausgewählt haben, indem Sie die Datenübertragung mit dem Viewmodel durchführen.

Aber wenn ich zu der Post-Methode für den Home-Index komme, sind meine SelectLists und SelectListItems null, während die Zeichenfolge für die Schaltfläche Info die richtigen Daten enthält.

Was mache ich falsch?

Dies ist meine Heimat Controller:

public ActionResult Index() 
    { 
     var viewModel = new HomeIndexViewModel() 
     { 
      // The lists with problem areas are populated. 
      problemAreas1 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
      problemAreas2 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
      problemAreas3 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName") 
     }; 
     return View(viewModel); 
    } 

    // 
    // POST: /Home/ 

    [HttpPost] 
    public ActionResult Index(HomeIndexViewModel viewModel) 
    { 
     // snip 
    } 

Meine Viewmodel:

public class HomeIndexViewModel 
{ 
    // A SelectList containing elements for the DropDownLists in the Home "Index" view. 
    public SelectList problemAreas1 { get; set; } 
    public SelectList problemAreas2 { get; set; } 
    public SelectList problemAreas3 { get; set; } 

    // Items chosen in the DropDownLists. 
    public SelectListItem itemOne { get; set; } 
    public SelectListItem itemTwo { get; set; } 
    public SelectListItem itemThree { get; set; } 

    // String for IDing what button is pressed. 
    public string submitButton { get; set; } 
} 

Und Ansicht meiner Heimat Index (die von HomeIndexViewModel erbt, ich den Code nicht enthalten, nur weil es vermasselt die post):

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm("Index", "Home", FormMethod.Post)) 
    {%> 
<h2> 
    Search for your problem:</h2> 
<asp:Label ID="Label1" runat="server" Width="300px"> 
Choose a problem area, and search for an answer to your problem in the FAQ, 
    or you can press the report button to report your problem.</asp:Label> 
<%-- Here are the DropDownLists. --%> 
<p style="width: 220px; height: 24px;"> 
    <%: Html.DropDownListFor(model => Model.itemOne, Model.problemAreas1, "Choose a problem area")%> 
</p> 
<p style="width: 220px;"> 
    <%: Html.DropDownListFor(model => Model.itemTwo, Model.problemAreas2, "Choose a problem area")%> 
</p> 
<p style="width: 220px"> 
    <%: Html.DropDownListFor(model => Model.itemThree, Model.problemAreas3, "Choose a problem area")%> 
</p> 
<p> 
    <%-- Here are the two buttons allowing people to do a search or create a new ticket respectively. --%> 
    <input type="submit" value="Search for problems" name="submitButton" id="searchButton" /> 
    <input type="submit" value="Report problem" name="submitButton" id="submitButton" /> 
</p> 
<%} %> 

Vielen Dank für Ihre Zeit. :-)

Antwort

3

Wenn Sie Ihr Formular zurück an die POST-Aktion senden, ist es völlig normal, dass die problemAreas1,2,3-Eigenschaften null sein werden, da ihre Inhalte nie veröffentlicht werden. Sie müssen sie auf die gleiche Weise wie bei Ihrer GET-Aktion neu füllen. Was die Eigenschaften itemOne, Two, Three betrifft, sollten sie einfache String-Werte sein und nicht vom Typ SelectListItem.

Modell:

public class HomeIndexViewModel 
{ 
    // A SelectList containing elements for the DropDownLists in the Home "Index" view. 
    public SelectList problemAreas1 { get; set; } 
    public SelectList problemAreas2 { get; set; } 
    public SelectList problemAreas3 { get; set; } 

    // Items chosen in the DropDownLists. 
    public string itemOne { get; set; } 
    public string itemTwo { get; set; } 
    public string itemThree { get; set; } 

    // String for IDing what button is pressed. 
    public string submitButton { get; set; } 
} 

Controller:

public ActionResult Index() 
{ 
    var viewModel = new HomeIndexViewModel() 
    { 
     // The lists with problem areas are populated. 
     problemAreas1 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
     problemAreas2 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
     problemAreas3 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName") 
    }; 
    return View(viewModel); 
} 

// 
// POST: /Home/ 

[HttpPost] 
public ActionResult Index(HomeIndexViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     // the model wasn't valid => 
     // show the same form so that the user can fix validation errors 
     viewModel.problemAreas1 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"); 
     viewModel.problemAreas2 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"); 
     viewModel.problemAreas3 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"); 
     return View(viewModel); 
    } 
    // TODO: everything went fine => update your database and redirect 
    return RedirectToAction("Index"); 
} 
+0

Ja, das ist was ich vermisst habe. String-Werte, Int-Werte, Guid-Werte oder einer der Value-Typen. –

+0

So hatte ich es, bevor ich meine DropDownLists in DropDownListFor änderte. Wenn ich Zeichenketten benutze und die Taste zum Durchsuchen der FAQ drücke (das Setup für die Listen ist dasselbe wie bei meiner Home-Indexansicht), bekomme ich folgende Ausnahme: Das ViewData-Objekt mit dem Schlüssel 'itemOne' ist vom Typ 'System. String 'muss aber vom Typ' IEnumerable 'sein. Aus diesem Grund habe ich sie in SelectListItems in erster Linie geändert. – KasMA1990

+0

Warte, vergiss es. Ich habe meine DropDownLists im FAQ-Controller nicht gefüllt. Danke für die Hilfe, es funktioniert jetzt. :-) – KasMA1990

0

Ich sehe die Seitendirektive nicht in Ihrer Ansicht, die es über Ihr Modell wissen lässt?

So etwas sollte die erste Zeile Ihrer Ansicht sein:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %> 
+0

Ja, ich versuchte es im Codeabschnitt hinzuzufügen, aber es vermasselt den Pfosten so ließ ich es aus. Ich habe vergessen, die Informationen hinzuzufügen, bevor ich sie gepostet habe, und habe 30 Sekunden später eine Bearbeitung vorgenommen. Ich habe es aber drin. :) Aber danke. :) – KasMA1990

+0

Wenn Sie debuggen, enthält Ihr viewModel tatsächlich die Objekte, die es auch annehmen soll? Ihr Code sieht gut aus, vielleicht ist Ihr Modell leer. – Slee

+0

Ja, wenn ich das Viewmodel debugge und öffne, ist alles da. Aber "submitButton" ist der einzige, der nicht null ist. – KasMA1990

0

Ihre Auswahllisten null sein werden, weil die Daten nicht wieder in Form geführt werden, das in Ordnung sein sollte. Da sie jedoch null sind, gibt es keine SelectListItem MVC kann in der Sammlung finden, um zurückzukehren, so dass es auch null ist.

Versuchen Hinzufügen Sie folgendes zu Ihrem Konstruktor HomeIndexViewModel statt in der Steuerung (nur um zu sehen, was passiert)

problemAreas1 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
problemAreas2 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName"), 
problemAreas3 = new SelectList(helpDeskRepository.GetProblemAreas(), "ProblemAreaID", "ProblemAreaName") 

Was ich das Bindemittel auf die Rückkehr des POST wird passieren, glauben Ihre HomeIndexViewModel mit den SelectLists schaffen bevölkert und sollte in der Lage sein, Ihre SelectListItem zu bevölkern.

Etwas scheint ein bisschen fischig obwohl. Mein Bauchgefühl sagt mir, dass die SelectListItem nicht null sein sollte.

+0

Okay, ich habe das ausprobiert, und meine SelectLists sind so gefüllt, wie sie sollten, aber meine SelectListItems sind immer noch null. Wenn ich jetzt eine der Schaltflächen drücke, bekomme ich eine MissingMethodException, die besagt, dass es keinen Konstruktor ohne Parameter für dieses Objekt gibt, wo der Code zuvor gestoppt wurde, weil er eine Nulleingabe von SelectListItems erhalten hat. – KasMA1990

+0

Es hört sich so an, als hätten Sie dem Controller anstelle des 'HomeIndexViewModel' einen Konstruktor hinzugefügt, oder der Konstruktor für das' HomeIndexViewModel' ist nicht parameterlos, was es auch sein sollte. –

+0

Würden Sie auch so freundlich sein, Ihre Frage mit der Ausgabe für eines der HTML-Select-Elemente zu aktualisieren? –

Verwandte Themen