2016-11-26 55 views
0

大家好!我在這裏是新來的,和其他人一樣,來爲我正在做的一個小項目尋求幫助。用asp.net mvc 5設置會話變量的值

我在C#和Razor上的代碼的工作原理如下:應用程序的用戶需要在先前存儲在數據庫中的配方中執行評級,但限制不能對食譜進行多次評級。

事情很好,但需要與評價配方的用戶一起添加該限制。我得到了一個列出所有用戶的DropDown列表,並且可以將所有用戶提交到數據庫中,但我希望已登錄的用戶提交表單,而沒有其他人或者「可選擇」,這就是現在的工作方式。

我使用會話變量獲取用戶的ID和一般信息,但我無法得到它的工作,因爲外鍵與此相關,當我嘗試手動檢索它時,我只獲得了ID(即表中的外鍵),但需要顯示誰在進行提交而不是ID,即使是在HiddenFor中被請求。

我該如何解決這個小問題?任何幫助是真正的讚賞:)從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"); 
    } 

GET和POST方法的完整視圖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

您的代碼示例有點混亂。您的控制器操作設置視圖包屬性,但您的剃鬚刀代碼看起來像視圖綁定到模型。我對你的困難的猜測是你的行爲是斷開的。如果您使用單獨的get/post控制器方法,那麼模型綁定可以將這些信息從客戶端傳遞到服務器,而無需使用viewbag或會話狀態。如果你願意,我可以在這裏發表一個例子。 – Paul

+0

是的,當然! :)我只發佈GET調用,因爲我認爲它會更容易理解,但似乎不是哈哈。我會將它附加到主帖子中,以便更好地檢查它。或者我應該爲這兩個文件添加完整的代碼? –

回答

0

的ViewBag物體用於給視圖數據跟...共事。

對於獲取/發佈操作,將視圖綁定到視圖模型將長遠得多。例如:

視圖模型:

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

控制器:

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

觀:

@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" /> 
    } 

注意: 使用 '隱藏' 在窗體上輸入具有一些安全風險。但是如果你在http post上執行驗證,風險應該非常小。