2016-06-08 2 views
1

Я довольно новичок в программировании на C#, ASP.NET и основе MVC, поэтому я все еще пытаюсь понять все с помощью электронных книг и конечно, интернет.Ошибка HTTP 404.0 при редактировании пользователя в ASP.Net - MVC

Я делаю тестовое веб-приложение, чтобы понять, понимаю ли я некоторые основы программирования в ASP.NET - MVC, и я начал с шаблона MVC по умолчанию, который вы получаете при запуске нового проекта в Visual Studio. Помня об этом, вы должны знать, что у этого шаблона уже есть действующая функция входа и регистрации пользователя, и после того, как я подключил ее к моей базе данных, я мог зарегистрировать столько пользователей, сколько захочу, и войти в систему с этим пользователем. Чтобы сделать это немного дальше, я хочу изменить свойства пользователя после регистрации учетной записи. После того, как я addes код ниже, я могу видеть информацию о пользователе, и я могу редактировать их, но когда я нажмите кнопку Сохранить я получаю следующее сообщение об ошибке:

http://puu.sh/pl5L5/b70da8b40d.png

Пожалуйста, имейте в виду, что я новичок, поэтому я извиняюсь, если этот вопрос довольно глуп. Заранее спасибо!

КОД

Новый взгляд под ManageController:

@using (Html.BeginForm("EditUser", "Manage", FormMethod.Post)) 
{ 
    <h4>Edit User Form.</h4> 
    @Html.AntiForgeryToken() 

    foreach (var prop in ViewData.ModelMetadata.Properties) 
    { 
     <div class="form-group"> 
      <label>@(prop.DisplayName ?? prop.PropertyName)</label> 
      @if (prop.PropertyName == "Description") 
      { 
       @Html.TextArea(prop.PropertyName, null, new { @class = "form-control", rows = 5 }) 
      } 
      else 
      { 
       @Html.TextBox(prop.PropertyName, null, new { @class = "form-control" }) 
      } 
      @Html.ValidationMessage(prop.PropertyName) 
     </div> 
    } 
    <div class="panel-footer"> 
     <input type="submit" value="Opslaan" class="btn btn-primary" /> 
     @Html.ActionLink("Cancel and return to List", "Index", null, new { @class = "btn btn-default" }) 
    </div> 
} 

новый EditUserViewModel:

public class EditUserViewModel 
{ 
    public string Id { get; set; } 

    [Required(AllowEmptyStrings = false)] 
    [Display(Name = "Email")] 
    [EmailAddress] 
    public string Email { get; set; } 

    [Required(AllowEmptyStrings = false)] 
    [Display(Name = "Voornaam")] //FirstName 
    public string Voornaam { get; set; } 

    [Required(AllowEmptyStrings = false)] 
    [Display(Name = "Achternaam")] //LastName 
    public string Achternaam { get; set; } 

    public string Telefoonnummer { get; set; } //Phonenumber 
} 

и 2 новые методы в ManageControlle r:

public async Task<ActionResult> EditUser(string id) 
    { 
     id = this.User.Identity.GetUserId(); 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var user = await UserManager.FindByIdAsync(id); 
     if (user == null) 
     { 
      return HttpNotFound(); 
     } 

     var userRoles = await UserManager.GetRolesAsync(user.Id); 

     return View(new EditUserViewModel() 
     { 
      Email = user.Email, 
      Voornaam = user.Voornaam, 
      Achternaam = user.Achternaam, 
      Telefoonnummer = user.PhoneNumber 
     }); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> EditUser([Bind(Include = "Id, Email, Voornaam, Achternaam, Telefoonnummer")]EditUserViewModel editUser) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByIdAsync(editUser.Id); 
      if (user == null) 
      { 
       return HttpNotFound(); 
      } 

      user.UserName = editUser.Email; 
      user.Email = editUser.Email; 
      user.Voornaam = editUser.Voornaam; 
      user.Achternaam = editUser.Achternaam; 
      user.VolledigeNaam = editUser.Email; 
      user.PhoneNumber = editUser.Telefoonnummer; 

      await UserManager.UpdateAsync(user); 

      return RedirectToAction("Index"); 
     } 
     ModelState.AddModelError("", "Something failed."); 
     return View(); 
    } 
+0

у вас есть только два поля в вашей точке зрения бритвы внутри формы и ваши действия внутри контроллера ожидают более двух, поэтому он не может отображаться правильное действия во время обратной передачи – Sherlock

+0

@Katana, в Еогеаспе переходит к каждому свойству в Модели и показывает это как поле. Поэтому у меня есть поле для каждого свойства, которое я использую. – NathanBaele

+0

Итак, ваш 404 генерируется вашим собственным кодом? Вы пробовали пройти через него и проверить правильность привязки вашей модели? Проверьте, какие значения идентификатора TextBox отображаются как в html. –

ответ

0

После поиска и поиска и поиска я, наконец, нашел проблему. В ManageController в методе EditUser это был следующий код:

return View(new EditUserViewModel() 
    { 
     Email = user.Email, 
     Voornaam = user.Voornaam, 
     Achternaam = user.Achternaam, 
     Telefoonnummer = user.PhoneNumber 
    }) 

Но проблема заключалась в том, что поле ID не получить значение пользователя. Я забыл об этом, потому что я не хотел, чтобы пользователи могли редактировать свой ID. Таким образом, код должен быть:

return View(new EditUserViewModel() 
    { 
     Id = user.Id 
     Email = user.Email, 
     Voornaam = user.Voornaam, 
     Achternaam = user.Achternaam, 
     Telefoonnummer = user.PhoneNumber 
    })