2014-10-13 3 views
0

Я использую ASP.NET MVC 4 для редактирования объектов модели через Html.BeginForm(). Проблема заключается в том, что когда я передаю объект модели, который нужно отредактировать, единственная часть представления, которая корректно отображает, - это кнопка Ok.Html.TextBoxFor() не отображается в представлении или не отображается как текст, когда в наборе полей даже несмотря на то, что я поставил перед ним «@». Вот код:Html.TextBoxFor() не отображается в поле зрения или отображается как текст, когда в поле установлено

AddEdit.cshtml

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>AddEdit</title> 
</head> 
<body> 
    <div> 
     @using (Html.BeginForm("Edit", "Home", FormMethod.Post)) 
     { 
      <fieldset> 
       @Html.TextBoxFor(model => model.Hero.Name); 

       <input type="submit" value="OK" /> 
      </fieldset> 
     } 
    </div> 
</body> 
</html> 

А вот мой класс контроллера:

public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public string GetData() 
     { 
      return JsonConvert.SerializeObject(new {data = new HeroStorage().GetAllViewModels()}); 
     } 

     [HttpPost] 
     public void Edit(AddEditViewModel model) 
     { 
      new HeroStorage().Update(model.Hero); 
      RedirectToAction("Index"); 
     } 

     //RETURNS THE VIEW 
     [HttpGet] 
     public ActionResult Edit(int ID) 
     { 
      return View("AddEdit", new AddEditViewModel(){Hero = new HeroStorage().GetByID(ID), Studios = new StudioStorage().GetAll()}); 
     } 

    } 
+1

Вы перенаправление Index, но индекс не возвращает объект в представление. – artm

+0

вы создаете новый объект типа HeroStorage(), а .GetByID (я думаю) ничего не возвращает. если вы используете базу данных в качестве модели, вам должно быть проще. В качестве альтернативы вы можете использовать опцию scaffolding, которая автоматически создает операции CRUD на данной модели. – jbutler483

+0

причина, по которой она не отображается * ничего *, потому что ваша модель прошла пустым и, следовательно, ничего не отобразит – jbutler483

ответ

0

Я бы этот пост в качестве комментария, но это не будет читаемым/и т.д., которые я думаю, что вы могли бы сделать большую пользу , Однако, вот некоторые из автогенерируемая код из рамок:

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

    <div class="form-horizontal"> 
     <h4>Pot</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.TrailerID) 

     @Html.HiddenFor(model => model.Pot) 

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

     <div class="form-group"> 
      @Html.LabelFor(model => model.Comments, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Comments, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Comments, "", 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> 
} 

Основные вещи, чтобы посмотреть здесь являются:

  1. использование @Html.EditorFor(...
  2. AntiForgeryToken
  3. Я использую EF

Th е [HttpPost] метод Edit:

[HttpPost] 
     [Authorize] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit([Bind(Include = "TrailerID,Pot,Capacity,Comments")] tbl_Pot tbl_Pot) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(tbl_Pot).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(tbl_Pot); 
     } 

PS/Отказ от ответственности: Пожалуйста, не беспокойтесь о наименовании моих TBL/записи, так как они относятся к топливной системе, а не какой-либо другой вид «Горшок»

0

Это происходит потому, что после обновления контента в сообщении методе Edit, вы перенаправление INDEX которые в свою очередь не пропускают какую-либо модель к виду, поэтому @Html.TextBoxFor(m => m.Hero.Name) пуст.

UPDATE:

В конце концов проблема была решена путем изменения TextBoxFor к EditorFor

+0

, это сообщение - OP спрашивает * «почему я не могу просмотреть его в представлении AddEdit»? – jbutler483

+0

@ jbutler483 это то, что я сказал «RedirectToAction (« Index »);', а затем Index возвращает 'return View();' поэтому она не передает какую-либо модель в это время –

+0

Опять же, не будем ли мы рассматривать метод действия [HttpGet] , в то время как вы смотрите на '[HttpPost]' Method - OP не ударил 'OK', и поэтому метод '[HttpGet]' является первой частью рендеринга - они не смогли * физически редактировать * это еще ... – jbutler483

0

Какой браузер это? Ваш код, похоже, работает в IE 11 и Chrome - т. Е. Я только что скопировал/вставил его и получил текстовое поле. Тем не менее, я хотел бы упомянуть следующее:

  1. Освободите полуколоду после @Html.TextBoxFor(model => model.Hero.Name). Вам это не нужно в выражении Razor.
  2. @Html.TextBoxFor(model => model.Hero.Name) относится к неизвестному объекту с именем «модель». Помните, что свойство, которое относится к фактической модели, является Model, а не «модель». Я бы рекомендовал изменить @Html.TextBoxFor(model => model.Hero.Name) на @Html.TextBoxFor(**heroName** => **M**odel.Hero.Name). Семантически это будет вернее & читаемым.
  3. У вас есть _Layout.cshtml в вашем проекте? Если да, то почему вы структурируете весь HTML в AddEdit.cshtml? Таким образом, HTML, отображаемый в браузере, становится недействительным и может быть . Некоторые браузеры не могут (не могут) разобрать его. Если вы используете _Layout.cshtml, рыхлое все, кроме содержания ТЕЛА в AddEdit.cshtml Do ШЕФ изданий в _Layout.cshtml
Смежные вопросы