2013-01-22 27 views
6

Tôi có một mẫu chỉnh sửa đơn giản cho mô hình người dùng nhưng khi tôi đăng lại, không có giá trị đầu vào bị ẩn nào được áp dụng cho mô hình và tôi không chắc chắn tại sao điều này xảy ra.Bài đăng MVC không thêm giá trị vào mẫu

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> 
} 

điều khiển của tôi:

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

UserProfile lớp:

[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; } 
} 

Nếu tôi cố gắng user.UserId nó sẽ trả về zero (vì nó là một int) nhưng nếu Tôi thử Request["UserId"] nó trả về giá trị chính xác để giá trị được đăng chính xác - không được thêm vào mô hình UserProfile. Có ai biết tại sao điều này đang xảy ra hoặc những gì tôi có thể làm gì để giải quyết nó

Cảm ơn

+0

HTML được tạo như thế nào cho trường bị ẩn? Bạn cũng có thể đăng mô hình UserProfile của mình không? – nemesv

+0

Pete

+1

HTML được tạo có vẻ ổn. Vì vậy, bạn có thể cập nhật bài viết của bạn với định nghĩa của lớp 'UserProfile' của bạn? – nemesv

Trả lời

7

Các DefaultModelBinder chỉ có thể ràng buộc tài sản công cộng.

Thay đổi setter tài sản của bạn cho công chúng và nó sẽ làm việc tốt:

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

Nếu bạn không thể làm điều đó, bạn sẽ cần tạo ra một chất kết dính mô hình tùy chỉnh trong đó đề với setters tin.

Tuy nhiên, đây là cách tiếp cận tốt hơn thay vì sử dụng trực tiếp UserProfile của bạn. Tạo một số UserProfileViewModel trong đó UserId của bạn công khai và sử dụng điều đó trong hành động Chế độ xem và Bộ điều khiển của bạn. Trong trường hợp này, bạn cần ánh xạ giữa UserProfileUserProfileViewModel nhưng có các công cụ tốt tồn tại cho tác vụ đó như AutoMapper.

+0

Đây là câu trả lời. Không thể sử dụng ** bộ riêng tư ** trong ngữ cảnh này. –

+0

rực rỡ, cảm ơn! – Pete

1

Như @nemesev đã nói, thuộc tính truy cập trên thuộc tính Mô hình của bạn cần phải là công khai.

Để giúp bạn không phải hack ở lớp cơ sở dữ liệu của bạn để tạo mô hình công việc ràng buộc, bạn nên tạo Mô hình cho lớp đó, bạn không cần sử dụng DTO trong chế độ xem (trong đó isn không lý tưởng).

Các vấn đề liên quan