1

J'ai utilisé ce code pour mettre à jour les données de l'utilisateur dans asp.net mvc 5 Je pense que tout est OK, mais je ne sais pas pourquoi je reçois un message d'erreur et les données ne sont pas enregistrées et if (ModelState.IsValid) dans le contrôleur est toujours. Quelqu'un pourrait-il m'aider s'il vous plaît?Pourquoi si l'instruction renvoie toujours false dans asp.net mvc lors de la mise à jour des données?

Controller Admin

[HttpGet] 
    public ActionResult EditUser(int id) 
    { 

     var load = db.Users.Find(id); 
     return View(load); 
    } 
    private const string _ImagesPathUser = "~/Images/User"; 

    [HttpPost] 
    public ActionResult EditUser(User user, HttpPostedFileBase UploadImage) 
    { 
     if (ModelState.IsValid) // always returns false 
     { 
      UserRepositories blUser = new UserRepositories(); 
      if (UploadImage != null) 
      { 
       // Delete exiting file 
       System.IO.File.Delete(Path.Combine(Server.MapPath(_ImagesPathUser), user.UserImage)); 
       // Save new file 
       string fileName = Guid.NewGuid() + Path.GetFileName(UploadImage.FileName); 
       string path = Path.Combine(Server.MapPath(_ImagesPathUser), fileName); 
       UploadImage.SaveAs(path); 
       user.UserImage = fileName; 
      } 
      if (blUser.Update(user)) 
      { 
       return JavaScript("alert(' added');"); 
      } 
      else 
      { 
       return JavaScript("alert(' didn't add');"); 
      } 
     } 
     else 
     { 
      return JavaScript("alert('Error');"); 
     } 
    } 

UserRepositories.cs

public bool Delete(int id, bool autoSave = true) 
    { 
     try 
     { 
      var entity = db.Users.Find(id); 
      db.Entry(entity).State = System.Data.Entity.EntityState.Deleted; 
      if (autoSave) 
      { 
       bool result = Convert.ToBoolean(db.SaveChanges()); 
       if (result) 
       { 
        try 
        { 
         if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\User\\" + entity.UserImage) == true) 
         { 
          File.Delete(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\User\\" + entity.UserImage); 
         } 
        } 
        catch { } 
       } 
       return result; 
      } 
      else 
       return false; 
     } 
     catch 
     { 
      return false; 
     } 

    } 

EditUser.cs

@model NP1.Models.User 

@{ 
ViewBag.Title = "EditUser"; 
Layout = "~/Views/Admin/AdminLayout.cshtml"; 
} 

<h2>EditUser</h2> 


@using (Html.BeginForm("EditUser", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", id = "myUploadForm5" })) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>User</h4> 
    <hr /> 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.UserID) 
    <div class="form-group"> 
     @Html.LabelFor(model => model.UserEmail, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.UserEmail) 
      @Html.ValidationMessageFor(model => model.UserEmail) 
     </div> 
    </div> 

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

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

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

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

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

    <div class="form-group"> 
     @Html.LabelFor(model => model.UserImage, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.ImageFor(model => model.UserImage, new { width = "300" }, "", "Images", "User") 
      @Html.Upload("UploadImage") 
      @Html.HiddenFor(model => model.UserImage) 
     </div> 
    </div> 

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

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

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

User.cs

public partial class User 
{ 
    public int UserID { get; set; } 
    public string UserEmail { get; set; } 
    public string UserFirstName { get; set; } 
    public string UserLastName { get; set; } 
    public string UserPassWord { get; set; } 
    public string UserCellPhone { get; set; } 
    public string UserTell { get; set; } 
    public string UserImage { get; set; } 
    public string UserAddress { get; set; } 
    public Nullable<byte> UserStatus { get; set; } 
    public Nullable<System.DateTime> UserBirthDate { get; set; } 
    public string UserGender { get; set; } 
} 

UserMetaData.cs

internal class UserMetaData 
{ 
    [ScaffoldColumn(false)] 
    [Bindable(false)] 
    public int UserID { get; set; } 

    [Required(ErrorMessage = "enter email", AllowEmptyStrings = false)] 
    [DisplayName("email")] 
    [Display(Name = "email")] 
    [RegularExpression(@"^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,4})$", ErrorMessage = "enter correct email")] 
    public string UserEmail { get; set; } 

    [Required(ErrorMessage = "enter your name", AllowEmptyStrings = false)] 
    [DisplayName("name")] 
    [Display(Name = "name")] 
    [StringLength(50, ErrorMessage = "should be 50")] 
    public string UserFirstName { get; set; } 

    [Required(ErrorMessage = "enter your last name", AllowEmptyStrings = false)] 
    [DisplayName("last name")] 
    [Display(Name = "last name")] 
    [StringLength(50, ErrorMessage = "should be 50")] 
    public string UserLastName { get; set; } 

    [Required(ErrorMessage = "enter password", AllowEmptyStrings = false)] 
    [Display(Name = "password")] 
    [DisplayName("password")] 
    [DataType(DataType.Password)] 
    public string UserPassWord { get; set; } 

    [Display(Name = "mobile")] 
    [DisplayName("mobile")] 
    [RegularExpression(@"^0?9[123]\d{8}$", ErrorMessage = "enter mobile correct")] 
    [StringLength(11, ErrorMessage = "should be 11")] 
    public string UserCellPhone { get; set; } 

    [Display(Name = "tel")] 
    [DisplayName("tel")] 
    [StringLength(11, ErrorMessage = "should be 11")] 
    public string UserTell { get; set; } 

    public string UserImage { get; set; } 
    public string UserAddress { get; set; } 

    [ScaffoldColumn(false)] 
    [Display(Name = "status")] 
    [DisplayName("status")] 
    public Nullable<byte> UserStatus { get; set; } 

    [Display(Name = "BirthDate")] 
    [DisplayName("BirthDate")] 
    public Nullable<System.DateTime> UserBirthDate { get; set; } 

    [Display(Name = "gender")] 
    [DisplayName("gender")] 


    public string UserGender { get; set; } 
    } 
} 
namespace NP1.Models 
{ 
[MetadataType(typeof(NP1.Models.MetaData.UserMetaData))] 
public partial class User 
{ 
    [Required(ErrorMessage = "enter your pass", AllowEmptyStrings = false)] 
    [Display(Name = "repeate pass")] 
    [DisplayName("repeate pass")] 
    [DataType(DataType.Password)] 
    [Compare("UserPassWord", ErrorMessage = "not equal")] 
    public string UserConfirmPassWord { get; set; } 

    public int Year { get; set; } 
    public int Month { get; set; } 
    public int Day { get; set; } 
} 
+1

Pouvez-vous poster le modèle? – NikolaiDante

+0

J'ai mis à jour mon poste cher @NikolaiDante –

+0

Vous pouvez vérifier votre erreur de cette façon: var errors = ModelState.Values.SelectMany (v => v.Errors); – Skatz1990

Répondre

2

Pour le débogage, vous pouvez ajouter ce code à votre action:

foreach (ModelState modelState in ViewData.ModelState.Values) { 
    foreach (ModelError error in modelState.Errors) { 
     //if you have some kind of logger use it here to get error data 
     // if not: 
     var e = error; 
    } 
} 

Mettre un point d'arrêt sur la ligne var e = error; et vérifiez cet objet d'erreur pour plus d'informations

+0

Merci, e obtient null valeur! :/ –

+0

Y at-il quelque chose dans 'modelState.Errors' –

+0

Merci, je trouve mon problème en utilisant votre code, merci beaucoup :) –

0

Vous avez peu de validations sur chacun des éléments d'entrée du modèle qui ne correspondent peut-être pas à des contraintes de base de données. Veuillez déboguer la ligne ModelState.Isvalid et utilisez une recherche rapide pour explorer les détails des erreurs/valeurs le cas échéant.

Vous pouvez également utiliser la ligne ci-dessous dans la méthode du contrôleur pour vérifier les erreurs de réponse du modèle dues aux valeurs d'entrée var errors = ModelState.Values.SelectMany (v => v.Errors); Vérifiez si cela vous aide.