Razor: как динамически присваивать значение текстовому полю только для чтения?

#c# #asp.net-mvc #razor

#c# #asp.net-mvc #razor

Вопрос:

У меня есть read-only текстовое поле, которое должно инициализироваться значением динамически. Это поле присутствует на странице, которая используется для ввода значений в сведения, соответствующие проигрывателю, который был создан на предыдущей странице (я использую RedirectToAction() для этой цели, но не смог получить доступ к переданному PlayerID значению «» из контроллера текущей страницы. Итак, решили использовать TempData . ). Поскольку PlayerID изменения происходят каждый раз при добавлении нового игрока, это поле должно отображать это значение, оставаясь доступным только для чтения. Кроме того, это required поле «, поэтому форма не может быть отправлена, пока не будет установлено значение.

  @Html.TextBoxFor(model => model.PlayerID, htmlAttributes: new { @readonly = "read-only", @class = "control-label col-md-2", value = @Html.Raw(TempData["PlayerID"]) })
  

Как я могу установить значение этого поля, как оно есть в TempData["PlayerID"] ?

Комментарии:

1. Никогда не устанавливайте value атрибут при использовании HtmlHelper метода. Вы присваиваете значение свойству PlayerID в методе GET перед передачей модели в представление (и нет такой вещи, как @readonly = "control-label col-md-2" — я полагаю, вы хотите @Html.TextBoxFor(model => model.PlayerID, new { @readonly = "readonly", @class = "control-label col-md-2" })

2. @StephenMuecke GET Метод имеет следующий код: public ActionResult Create() { ViewBag.PlayerID = new SelectList(db.PersonalDetails, "ID", "FirstName"); return View(); } Но PlayerID он не отображается в этом текстовом поле только для чтения. Как мне его отобразить?

3. A SelectList предназначен для использования в выпадающем списке (не в текстовом поле)!

4. @StephenMuecke Мне просто нужно отобразить PlayerID игрока, созданного на предыдущей странице, а не перечислять идентификаторы всех существующих игроков. И нужно сделать его доступным только для чтения, потому что пользователь может добавлять только сведения о существующем игроке и не может изменить его идентификатор.

5. В своем вопросе вам нужно подробнее рассказать о том, что вы хотите сделать, и о рабочем процессе. Ваш код и комментарии не имеют смысла без определенного контекста. Для чего это представление, что такое модель, каковы методы контроллера (включая тот, в котором вы перенаправлены на метод, который сгенерировал это представление. Если вы ранее создали a Player , затем передайте его идентификатор этому методу, а затем установите значение свойства на основе этого идентификатора.

Ответ №1:

У вас может быть либо JavaScript, который запускается при загрузке страницы, например:

 @section Scripts
{
 <script>
   $(function(){
    $("#PlayerID").val('@TempData["PlayerID"]');
   });
 </script>
}
  

Или вы можете инициализировать модель для представления внутри действия, поэтому, если ваше имя действия было ‘PlayerDetails’, тогда у вас должно быть что-то вроде этого:

 public ActionResult PlayerDetails()
{
  return View(new Player{PlayerID=TempData["PlayerID"]}
}
  

Таким образом, когда представление привязывается к модели представления, оно будет инициализировано переданным значением.

Ответ №2:

Вы можете попробовать следующий код:

 @Html.TextBox("PlayerID", @TempData["PlayerID"] ,new { @readonly = "read-only", @class = "control-label col-md-2"})
  

Или в вашем случае:

 @Html.TextBoxFor(model => model.PlayerId, htmlAttributes: new { @readonly = "read-only", @class = "control-label col-md-2", Value = @Html.Raw(TempData["PlayerID"]) })