2013-01-22 12 views
6

Mam prosty formularz edycji dla modelu użytkownika, ale kiedy wysyłam z powrotem, żadna z ukrytych wartości wejściowych nie są stosowane do modelu i nie jestem pewien, dlaczego tak się dzieje.Post MVC nie dodając wartości do modelu

My Razor:

@model CMS.Core.Models.UserProfile 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset class="normalForm"> 
     <legend>User Profile</legend> 

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

     <div class="formRow"> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.EmailAddress) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.EmailAddress, new { @class = "textbox" }) 
       @Html.ValidationMessageFor(model => model.EmailAddress) 
      </div> 
     </div> 

     <div class="formRow"> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.FirstName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.FirstName, new { @class = "textbox" }) 
       @Html.ValidationMessageFor(model => model.FirstName) 
      </div> 
     </div> 

     <div class="buttonRow"><input type="submit" value="Save" class="button" /></div> 
    </fieldset> 
} 

mojego kontrolera: class

[HttpPost] 
    public ActionResult Edit(UserProfile user) 
    { 
     if (ModelState.IsValid) 
     { 
      user.Save(); 
      return RedirectToAction("Index"); 
     } 
     return View(user); 
    } 

UserProfile:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; private set; } 


    [Required(ErrorMessage = "Please enter an email address")] 
    [StringLength(350)] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email Address")] 
    public string EmailAddress { get; set; } 


    [StringLength(100)] 
    [DataType(DataType.Text)] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
} 

Gdy próbuję user.UserId powraca do zera (tak jak jest to int), ale jeśli Próbuję Request["UserId"] zwraca poprawną wartość, więc wartość jest wysyłana poprawnie - po prostu nie dodano do modelu UserProfile. Czy ktoś wie dlaczego tak się dzieje i co mogę zrobić, aby rozwiązać go

Dzięki

+0

Jak jest generowany HTML do ukrytego pola? Czy możesz też opublikować swój model UserProfile? – nemesv

+0

Pete

+1

Wygenerowany HTML wygląda dobrze. Czy możesz zaktualizować swój wpis definicją klasy 'UserProfile'? – nemesv

Odpowiedz

7

DefaultModelBinder tylko w stanie związać publicznych właściwości.

Zmień swoją właściwość do setter publicznych i powinny działać prawidłowo:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int UserId { get; set; } 

Jeśli nie można zrobić, że trzeba będzie tworzyć niestandardowe spinacza modelu, który zajmuje się prywatnymi ustawiaczy.

Jednak jako lepsze podejście zamiast bezpośredniego korzystania z urządzenia UserProfile. Utwórz numer UserProfileViewModel, w którym twój UserId jest publiczny i używaj go w akcji Widok i kontroler. W takim przypadku musisz mapować między swoimi UserProfile i UserProfileViewModel, ale istnieją dobre narzędzia dla tego zadania, takie jak AutoMapper.

+0

To jest odpowiedź. Nie można użyć ** prywatnego zestawu ** w tym kontekście. –

+0

genialny, dzięki! – Pete

1

Jak powiedział @nemesev, właściwości akcesora we właściwościach modelu muszą być następujące: public.

Aby uchronić się przed zniszczeniem klasy bazy danych, aby powiązanie modelu działało, naprawdę powinieneś stworzyć model dla tej klasy, wtedy nie musisz używać DTO w widoku (który nie jest ideał).

Powiązane problemy