2016-08-19 3 views
1

Arbeiten an meinem ersten MVC ASP.NET-Projekt. Ich frage mich, wie ich das Modell mit den Eingaben des Benutzers aktualisieren kann.Aktualisieren Modell von anzeigen

Sagen wir, ich habe ein Modell PersonModel.cs

public class PersonModel 
{ 
    int personID; 
    string firstName; 
    string lastName; 
    string favoriteColor; 

    public PersonModel(int personID){ 
    this.PersonID=personID; 
    //..Fetching data from DB to fill firstName and lastName using personID 
    //At this point, personID,firstName and lastName are set, only the favoriteColor is missing 
    } 
} 

Jetzt ist mein Controller:

public class PersonController : Controller 
{ 
    public ActionResult Index() { 
    PersonModel person = new PersonModel(this.UserId()); 

    return View(person); 
} 

Meiner Ansicht:

@using Portail.Models 
@model PersonModel 

@ViewBag.Title = "Welcome page" 

<h2> Hello @Model.firstName @Model.lastName </h2>   

Für jetzt ist es gut funktioniert, zeigt die Vor- und Nachnamen des Benutzers, entsprechend den Werten im DB.

Ich möchte, dass der Benutzer eine Farbe in einer Liste auswählt und dann diese Farbe als favoriteColor-Variable im Modell festlegt, und dann die DB mit diesem aktualisieren. Zum Beispiel durch eine Dropdown-Liste hinzufügen:

<select> 
    <option value="red">Red</option> 
    <option value="blue">Blue</option> 
    <option value="green">Green</option> 
    <option value="yellow">Yellow</option> 
</select> 

Wie kann ich mein Modell aktualisieren, indem Sie die gewählte Farbe für favorite Einstellung?

Beachten Sie, dass dies nur ein Beispiel ist, für das Projekt, an dem ich arbeite, muss ich ein paar Variablen aktualisieren, nicht nur eine, wie es hier der Fall ist. Außerdem handelt es sich um vertrauliche Daten, daher möchte ich in der URL nichts weitergeben.

Antwort

2

PersonModel Unter der Annahme, hat eine öffentliche Eigenschaft mit dem Namen FavoriteColor wie unten

public class PersonModel 
{ 
    .... 
    .... // other properties and methods 
    .... 

    public string FavoriteColor { get; set; } 
} 

Sie können wie innerhalb Html.BeginForm, und fügen Sie eine Schaltfläche zum Senden name="FavoriteColor" Attribut auf den <select> Tag, legen Sie den <select> Tag hinzufügen unter

@using (Html.BeginForm("Index", "Person")) 
{ 
    <select name="FavoriteColor"> 
     <option value="red">Red</option> 
     <option value="blue">Blue</option> 
     <option value="green">Green</option> 
     <option value="yellow">Yellow</option> 
    </select> 
    <input type="submit" name="Save" value="Save" /> 
} 

Fügen Sie dann eine neue Index Aktionsmethode mit [HttpPost] Attribut undhinzuals Parameter in Ihrem Controller

[HttpPost] 
public ActionResult Index(PersonModel model) 
{ 
    // here model.FavoriteColor will be what's selected in the dropdownlist 

    // update your database here 

    return View(model); 
} 

Wenn Sie den Absenden-Button klicken, wird die Httppost Aktionsmethode oben ausgeführt werden, und der Wert von model.FavoriteColor sein wird, was Sie in der Dropdownlist auswählen. Danach können Sie diesen Wert verwenden, um Ihre Datenbank zu aktualisieren.

Der obige Code zeigt nur, wie Sie Lieblingsfarbe aus Ihrer Ansicht senden. Wenn Sie die Person id müssen die Datenbank aktualisieren, dann müssen Sie ein verstecktes Feld hinzuzufügen, die die Person id-Wert hält innen Html.BeginForm

@using (Html.BeginForm("Index", "Person")) 
{ 
    @Html.HiddenFor(m => m.PersonID) 
    <select name="FavoriteColor"> 
     <option value="red">Red</option> 
     <option value="blue">Blue</option> 
     <option value="green">Green</option> 
     <option value="yellow">Yellow</option> 
    </select> 
    <input type="submit" name="Save" value="Save" /> 
} 

blockieren und Sie können die Person id in model.PersonID in Ihrer Httppost Aktionsmethode erhalten.

Sobald Sie die oben genannten verstehen, sollten Sie lernen, Html.DropDownListFor zu verwenden, um die Dropdown-Liste zu füllen.Dies wäre ein guter Anfang sein: Populating a razor dropdownlist from a List<object> in MVC

+0

Danke! Es funktionierte zunächst nicht, die favoriteColor war null für das Modellobjekt, aber sobald ich {get; set} (öffentliche Zeichenkette favoriteColor {get; set;}) in PersonModel.cs hat es funktioniert :) –

+0

Gut zu wissen, dass Sie es herausgefunden haben :), der Schlüssel ist das name-Attribut der Eingabe-Tags muss mit dem Eigenschaftsnamen des Modells übereinstimmen. Mit 'Html.TextBoxFor',' Html.HiddenFor' und 'Html.DropDownListFor' wird sichergestellt, dass sie immer gleich sind, falls der Eigenschaftsname im Modell geändert wird. – ekad

0

In Ihrem Controller, werden Sie eine Index-Methode erstellen müssen, aber mit einem Httppost-Attribut versehen, wie folgt aus:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Index(PersonModel model) 
    { 
     //validate and store the model somehow 
     if (ModelState.IsValid) 
     { 
      var person = _dbcontext.Persons.SingleOrDefault(p => p.personId == model.personID); 
      if(person != null) 
      { 
       person.favoriteColor = model.favoriteColor; 
       _dbcontext.SaveChanges(); 
      } 
     } 
     return View(); 
    } 

Ihre Ansicht müssten haben zu haben, so ein verstecktes Feld und eine Form so etwas wie:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.personID) 
    <div class="form-horizontal"> 
     <h4>PersonModel</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.favoriteColor, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.favoriteColor, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.favoriteColor, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

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

In diesem Beispiel wird ein Textfeld, aber Sie können die DropDownFor Htmlhelper verwenden, um zu erreichen, was Sie zu tun versuchen. Hoffentlich bringt dich das auf die richtige Spur.

Verwandte Themen