2016-09-26 3 views
1

Я новичок в MVC, и мне сложно решить эту проблему. Я получил идентификатор пользователя через Session["LoggedUserID"], когда он появится после входа пользователя. Я хочу передать его следующему коду cshtml (или непосредственно в контроллере), который я пока не понимаю. Это действие происходит, когда пользователь хочет создать новую запись.Как передать данные сеанса с контроллера на View (MVC)

вид внутри cshtml (код, созданный автоматически из контроллера):

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

Мой код контроллера:

[HttpGet] 
     public ActionResult Create() 
     { 
      return View(); 
     } 

[HttpPost] 
public ActionResult Create(Review review) 
{ 
    if (ModelState.IsValid) { 

     db.Reviews.Add(review); 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(review);   
} 

Как передать Session["LoggedUserID"] в cshtml (или непосредственно через контроллер)? Таблица обзора использует userID как FK для идентификатора пользователя.

EDIT: Сообщение об ошибке я получаю за мой текущий код:

There is no ViewData item of type 'IEnumerable' that has the key 'CreatorUserId'.

Любая помощь очень ценится. Благодарю.

+0

Вы можете получить доступ к сеансу в контроллере, поэтому неясно, в чем проблема. –

+2

Возможный дубликат [Доступ к сеансу просмотра на странице просмотра в ASP.Net MVC] (http://stackoverflow.com/questions/21088514/access-session-on-view-page-in-asp-net-mvc) –

+1

Или http : //stackoverflow.com/questions/18608452/mvc-4-how-pass-data-correctly-from-controller-to-view ... Действительно непонятно, с чем вы столкнулись (возможно, потому, что вы не понимаете, как ASP .Net MVC работает, а может быть, как работает сессия). –

ответ

2

Если это для сохранения с сущностью, нет необходимости передавать его на просмотр и отправлять его обратно на сервер. Вы можете использовать его непосредственно в методе действия HttpPost.

[HttpPost] 
public ActionResult Create(Review review) 
{ 
    if (ModelState.IsValid) 
    { 
     if(Session["LoggedUserID"]==null) 
     { 
      return Content("Session LoggedUserID is empty"); 
     } 

     review.UserID = Convert.ToInt32(Session["LoggedUserID"]); 
     db.Reviews.Add(review); 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(review);   
} 

Я также добавил условие, если проверить Session["LoggedInUserID"] является недействительным, прежде чем читать его к Int переменной (UserID свойства). В идеале вы можете перенести это из метода действий, чтобы проверить, зарегистрирован ли пользователь или нет (может быть фильтр действий like this)

+0

Я все еще получаю такую ​​же ошибку: 'Нет элемента ViewData типа 'IEnumerable', который имеет ключ 'CreatorUserId' .' ** в строке -> ** '@ Html.DropDownList (" CreatorUserId ", null, htmlAttributes: new {@class =" form-control "})'. Поскольку я использую guid вместо int для 'userID', мне пришлось изменить' review.UserID = Convert.ToInt32 (Session ["LoggedUserID"]), '** to **' Guid guidSess = new Guid (Session ["LoggedUserID"] .Нанизывать()); 'и передать' guidSess' в 'review.CreatorUserId = guidSess;'. Это было сделано правильно? На всякий случай это вызвало ошибку. – skylake

+1

Нет. Ваша ошибка связана с тем, что ваш код просмотра использует вспомогательный метод DropDownList, который ожидает, что вы установите данные, необходимые для заполнения раскрывающегося списка в словаре Viewdata. Поскольку нет необходимости показывать выпадающий список, просто удалите внешний div, который содержит строку '@ Html.DropDownList' и' ValidationMessageFor' с вашего вида – Shyju

+0

А я вижу! Вы упомянули об этом раньше, но я случайно не обратил на это внимания. Спасибо, я очень многому научился. – skylake

1

Вам необходимо привязать значение i.e «Идентификатор пользователя», чтобы просмотреть модель или поместить ее в сумку, и вы можете получить доступ к ней в cshtml.

E.g.

SampleViewModel vm = new SampleViewModel(){UserId = yourvalue}; 

Вам нужно создать этот SampleViewModel класс со свойством называется UserId, а затем вы можете использовать, как это. Вам также необходимо привязать модель представления к вашему cshtml - @model SampleViewModel.cs

или вы можете сохранить стоимость в сумке. , т. Е.

ViewBag.UserId = your-value; //You can call @ViewBag.UserId in cshtml page. 

Помогает ли это?

Смежные вопросы