2016-12-22 11 views
0

У меня были проблемы с viewmodels на некоторое время, и я хотел бы что-то прояснить. В моей модели просмотра я могу показать «индекс», и я могу добавить нового сотрудника «create», но «Edit» не работает.MVC viewmodel Редактор ничего не показывает после Httppost

Я могу показать страницу редактирования, выполнить мои изменения (например, изменить имя), но когда я отправлю обратно, все данные отображаются как null. В «create», после того, как я разместил вставку, контроллер ПОКАЗЫВАЕТ изменения (EmployeeViewModel) и вставляет запись. Он просто не показывает, когда вы делаете «редактирование».

Это что-то присущее viewmodel или есть что-то еще?

Вот мой ViewModel класс (база данных первого):

public partial class Employee 
    { 
     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public Nullable<int> DepartmentId { get; set; } 
     public string Address { get; set; } 

     public virtual Department Department { get; set; } 
    } 

public partial class Department 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Department() 
     { 
      this.Employees = new HashSet<Employee>(); 
     } 

     public int DepartmentId { get; set; } 
     public string DepartmentName { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Employee> Employees { get; set; } 
    } 

    public class EmployeeViewModel 
    { 
     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public Nullable<int> DepartmentId { get; set; } 
     public string Address { get; set; } 
     public string DepartmentName { get; set; } 

    } 

Вот мой контроллер:

public class TestController : Controller 
    { 
     public db dContext = new db(); 
     public ActionResult Index() 
     { 
      List<Employee> employeelist = dContext.Employees.ToList(); 
      EmployeeViewModel employeeVM = new EmployeeViewModel(); 

      List<EmployeeViewModel> employeeVMList = employeelist.Select(x => new EmployeeViewModel 
      { 
       Name = x.Name, 
       EmployeeId = x.EmployeeId, 
       Address = x.Address, 
       DepartmentId = x.DepartmentId, 
       DepartmentName = x.Department.DepartmentName 
      }).ToList(); 
      return View(employeeVMList);  
     } 
     public ActionResult Create() 
     { 
      return View(); 
     } 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(EmployeeViewModel employeeVM) 
     { 
      if (ModelState.IsValid) 
      { 
       Employee e = new Employee(); 
       e.EmployeeId = employeeVM.EmployeeId; 
       e.Name = employeeVM.Name; 
       e.DepartmentId = employeeVM.DepartmentId; 
       e.Address = employeeVM.Address; 

       dContext.Employees.Add(e); 
       dContext.SaveChanges(); 

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

     public ActionResult Edit(EmployeeViewModel em , int? id) 
     { 
      var dbEmpVM = (from e in dContext.Employees 
          join d in dContext.Departments 
          on e.DepartmentId equals d.DepartmentId 
          where e.EmployeeId == id 
          select new EmployeeViewModel 
          { 
           EmployeeId = e.EmployeeId, 
           DepartmentId=e.DepartmentId, 
           Address=e.Address, 
           Name=e.Name, 
           DepartmentName=d.DepartmentName 
          }).ToList();  
      return View(dbEmpVM ); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(EmployeeViewModel model, int id) 
     { 
      string name = Request.Form["EmployeeId"]; 
      string naaanm = model.EmployeeId.ToString(); 

      return RedirectToAction("Index"); 
     } 
    } 

А вот мой Edit:

@model IEnumerable<MVCTutorial.Models.EmployeeViewModel> 
@{ 
    ViewBag.Title = "Edit"; 
} 
<h4>(EmployeeViewModel)</h4> 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    foreach (var item in Model) 
    { 
<div class="form-group"> 
    @Html.LabelFor(i => item.EmployeeId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.EmployeeId, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.EmployeeId, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(i => item.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.Name, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.Name, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(i => item.DepartmentId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.DepartmentId, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.DepartmentId, "", new { @class = "text-danger" }) 
    </div> 
</div> 
     <div class="form-group"> 
      @Html.LabelFor(i => item.DepartmentName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(i => item.DepartmentName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(i => item.DepartmentName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(i => item.Address, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(i => item.Address, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(i => item.Address, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    } 
<div class="form-group"> 
    <div class="col-md-offset-2 col-md-10"> 
     <input type="submit" value="Edit" class="btn btn-default" /> 
    </div> 
</div> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

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

EmployeeViewModel

ответ

0

Ваш текущий код (в режиме редактирования) будет генерировать входную разметку, как показано ниже.

<input class="form-control text-box single-line" 
     id="item_DepartmentName" name="item.DepartmentName" type="text" value="SomeName" /> 

См. Значение атрибута имени. Это "item.DepartmentName". Ваш параметр метода действия HttpPost - это тип EmployeeViewModel, который не имеет свойства с этим именем! Таким образом, модельное связующее не сможет сопоставить данные формы, размещенные из вашей формы, с этим именем ("item.DepartmentName") на любые свойства вашего параметра метода.

Решение должно обновить значение поля ввода , чтобы оно соответствовало именам свойств вашего EmployeeViewModel. В идеале ваш код должен генерировать разметку, как показано ниже.

<input name="DepartmentName" type="text" value="Some value" /> 

Вы можете explcitily указать name атрибут ALUE при вызове HTML хелперы. Например, с Html.TextBoxFor помощником

@Html.TextBoxFor(i => item.DepartmentName, 
           new { @class = "form-control", NAME = "DepartmentName" }) 

Теперь, когда вы отправите форму, модель связующий будет иметь возможность отобразить значение этого поля формы в DepartmentName свойства вашего EmployeeViewModel объекта.

+0

Shyju-спасибо за ответ. Я все еще потерян. Мне все отлично. Есть что-то еще, что мне не хватает? Должен ли я изменить его на «TextBoxFor» ... вместо «EditorFor», потому что это другой класс (Department)? –

+0

Если вы просто хотите ввести поле ввода для ввода пользователем, используйте вспомогательный метод TextBoXFor. – Shyju

+0

Я изменил строку на Html.TextBoxFor (i => item.DepartmentName, new {htmlAttributes = new {@class = "form-control"}}). Он по-прежнему показывает значение null. Что-то еще не так? –