2016-11-26 4 views
0

alle! Ich bin neu hier und wie alle anderen auch, um Hilfe für ein kleines Projekt zu bekommen, an dem ich gerade arbeite.Setzen eines Wertes aus Session-Variablen mit asp.net mvc 5

Mein Code auf C# und Razor funktioniert wie folgt: Der Benutzer einer App muss eine Bewertung in einem zuvor in der Datenbank gespeicherten Rezept durchführen, mit der Einschränkung, dass ein Rezept nicht mehrfach bewertet werden kann.

Die Sache ist in Ordnung, aber muss diese Einschränkung in Verbindung mit dem Benutzer hinzufügen, der das Rezept bewertet. Ich habe eine DropDown-Liste, die alle Benutzer auflistet und kann die Übermittlung in DB und alle tun, aber ich möchte, dass der angemeldete Benutzer das Formular abgibt, und niemand sonst oder "auswählbar" ist, so funktioniert das jetzt.

Ich benutze Sitzungsvariablen, um die ID des Benutzers und allgemeine Informationen zu erhalten, aber ich kann es nicht in Arbeit bringen, weil der Fremdschlüssel dazu passt, und wenn ich versuche, es manuell abzurufen, habe ich nur die ID (das ist der Fremdschlüssel in der Tabelle), muss aber anzeigen, wer die Übermittlung durchführt und nicht die ID, selbst wenn dies in einem HiddenFor erforderlich ist.

Wie kann ich dieses kleine Problem lösen? Jede Hilfe ist wirklich geschätzt :)

Die GET und POST-Methoden von recetastblController.cs

// GET: recetastbl/Rate 
    public ActionResult Rate(usuariostbl usuariostbl) 
    { 
     var puntuaciontbl = db.puntuaciontbl.Include(p => p.recetastbl).Include(p => p.usuariostbl); 

     ViewBag.usuariostbl = Session["usuarioConectado"]; 
     ViewBag.usuariostbl_id = ViewBag.usuariostbl.id; 
     ViewBag.usuariostbl.username = ViewBag.usuariostbl.username; 

     ViewBag.usuariostbl_id = new SelectList(db.usuariostbl, "id", "username"); 
     ViewBag.recetastbl_id = new SelectList(db.recetastbl, "id", "receta"); 

     return View(); 
    } 

    // POST: recetastbl/Rate 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Rate([Bind(Include = "id,valoracion,usuariostbl_id,recetastbl_id")] puntuaciontbl puntuaciontbl) 
    { 
     if (ModelState.IsValid) 
     { 
      db.puntuaciontbl.Add(puntuaciontbl); 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     ViewBag.usuariostbl_id = new SelectList(db.usuariostbl, "id", "username", puntuaciontbl.usuariostbl_id); 
     ViewBag.recetastbl_id = new SelectList(db.recetastbl, "id", "receta", puntuaciontbl.recetastbl_id); 

     return View("Index"); 
    } 

Die vollständige Ansicht Rate.cshtml

@model Prueba3Progra4.puntuaciontbl 

@{ 
    ViewBag.Title = "Valorar Receta"; 
} 

<h2>Valorar</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>Receta</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     @Html.LabelFor(model => model.valoracion, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      1 Estrella 
      @Html.RadioButtonFor(model => model.valoracion, "1", new { htmlAttributes = new { @class = "form-control" } }) 
      2 Estrellas 
      @Html.RadioButtonFor(model => model.valoracion, "2", new { htmlAttributes = new { @class = "form-control" } }) 
      3 Estrellas 
      @Html.RadioButtonFor(model => model.valoracion, "3", new { htmlAttributes = new { @class = "form-control" } }) 
      4 Estrellas 
      @Html.RadioButtonFor(model => model.valoracion, "4", new { htmlAttributes = new { @class = "form-control" } }) 
      5 Estrellas 
      @Html.RadioButtonFor(model => model.valoracion, "5", new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.valoracion, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.usuariostbl_id, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("usuariostbl_id", null, htmlAttributes: new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.usuariostbl_id, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.recetastbl_id, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("recetastbl_id", null, htmlAttributes: new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.recetastbl_id, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

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

<div> 
    @Html.ActionLink("Volver a la Lista", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

Ihr Codebeispiel ist ein wenig verwirrend. Ihre Controller-Aktion legt die Ansichtsbeuteleigenschaften fest, aber Ihr Rasierercode sieht so aus, als wäre die Ansicht an ein Modell gebunden. Meine Spekulationen über Ihre Schwierigkeit sind, dass Ihre Aktionen getrennt sind. Wenn Sie separate Methoden zum Abrufen/Weiterleiten von Controllern verwenden, können Sie diese Informationen vom Client zum Server leiten, ohne den Viewbag- oder Sitzungsstatus verwenden zu müssen. Ich kann hier ein Beispiel veröffentlichen, wenn Sie möchten. – Paul

+0

Ja, sicher! :) Ich habe nur den GET-Aufruf gepostet, weil ich denke, es wäre einfacher zu verstehen, aber scheint nicht hahaha. Ich werde es an den Hauptpost anhängen, damit Sie es besser überprüfen können. Oder sollte ich den vollständigen Code für beide Dateien hinzufügen? –

Antwort

0

Das ViewBag Objekt für die Gewährung der Ansicht Daten gedacht arbeiten mit.

Bei Get/Post-Operationen ist die Bindung der Ansichten an ein Ansichtsmodell auf lange Sicht wesentlich besser. Zum Beispiel:

The View Modell:

public class usuarioConectado 
    { 
     public string usuariostbl_id { get; set; } // 'hidden for' 
     public string username { get; set; } // 'hidden for' 
     [Display(Name = "Valoracion")] 
     public ICollection<string> valoracion { get; set; } 
     [Display(Name = "Usuarios Id")] 
     public ICollection<string> usuariostbl_id_list { get; set; } 
     [Display(Name = "Recetas Id")] 
     public ICollection<string> recetastbl_id_list { get; set; } 
    } 

Der Controller:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Rate() 
    { 
     return View(GetNewModel()); 
    } 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Rate(usuarioConectado model) 
    { 
     /// 
     /// When the user posts the form, 
     /// the model parameter will have all 
     /// of the values set in the 'get' method, 
     /// along with the items selected. 
     /// 
     SaveModel(model); 
     return View(GetNewModel()); 
    } 
    private usuarioConectado GetNewModel() 
    { 
     return new usuarioConectado() 
     { 
      recetastbl_id_list = new List<string>() { "1", "2", "3" }, 
      usuariostbl_id_list = new List<string>() { "4", "5", "6" }, 
      valoracion = new List<string>() { "7", "8", "9" }, 
      username = "usuario1", 
      usuariostbl_id = "1", 
     }; 
    } 
    private void SaveModel(usuarioConectado model) 
    { 
     //Save Stuff 
    } 

The View:

@model MVCAnswers.Models.usuarioConectado 


@{ 
    ViewBag.Title = "Ans40824091"; 
    Layout = "~/Views/Shared/_Default.cshtml"; 
} 

<h2>Ans40824091</h2> 

    @using (Html.BeginForm("Rate", "Ans40824091")) 
    { 
     <div class="form-group > 
      @Html.LabelFor(model => model.usuariostbl_id_list, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.usuariostbl_id_list, new SelectList(Model.usuariostbl_id_list, Model.usuariostbl_id_list), htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.usuariostbl_id, "", new { @class = "text-danger" }) 
      </div> 
      @Html.LabelFor(model => model.recetastbl_id_list, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.recetastbl_id_list, new SelectList(Model.recetastbl_id_list, Model.recetastbl_id_list), htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.recetastbl_id_list, "", new { @class = "text-danger" }) 
      </div> 
      @Html.LabelFor(model => model.valoracion, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.valoracion, new SelectList(Model.valoracion, Model.valoracion), htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.valoracion, "", new { @class = "text-danger" }) 
      </div> 
      <h2>Hidden:</h2> 
      <div class="col-md-10"> 
       @Html.Hidden("username", Model.username) 
       @Html.Hidden("usuariostbl_id", Model.usuariostbl_id) 
      </div> 
      <input type="submit" name="submit" value="Submit" /> 
    } 

Achtung: Mit 'versteckte' Eingang auf einem Formular hat einige Sicherheitsrisiken. Aber wenn Sie die Validierung auf dem HTTP-Post durchführen, sollte das Risiko sehr gering sein.