2012-08-22 38 views
5

Tôi có một ViewModel có chứa hai đối tượng:Làm thế nào để vượt qua toàn bộ một ViewModel trở lại với bộ điều khiển

public class LookUpViewModel 
{ 
    public Searchable Searchable { get; set; } 
    public AddToSearchable AddToSearchable { get; set; } 
} 

Hai chứa mô hình giống như thế này:

public class Searchable 
{ 
    [Key] 
    public int SearchableId { get; set; } 
    public virtual ICollection<AddToSearchable> AddedData { get; set; } 
} 

public class AddToSearchable 
{ 
    [Key] 
    public int AddToSearchableId { get; set;} 
    [Required] 
    public int SearchableId { get; set; } 
    [Required] 
    public String Data { get; set; } 
    [Required] 
    public virtual Searchable Searchable { get; set; } 
} 

Tôi có một quan điểm cho rằng sử dụng số LookUpViewModel của tôi và nhận dữ liệu nhập để tìm kiếm SearchableId. Nếu tìm thấy đối tượng Searchable, một đối tượng LookUpViewModel được tạo và chuyển đến Chế độ xem. Chế độ xem sau đó hiển thị các trường của trình chỉnh sửa cho AddToSearchable.Data. Sau khi gửi, tôi muốn LookUpViewModel được chuyển đến một phương thức hành động để xử lý tất cả mã back-end. Vấn đề duy nhất là, LookUpViewModel được chuyển đến phương thức hành động của tôi chứa tham chiếu null đến Searchable và tham chiếu hợp lệ đến AddToSearchable .. tức là tôi thiếu một nửa dữ liệu của mình.

Dưới đây là một ví dụ về những gì quan điểm của tôi trông giống như:

@model HearingAidTrackingSystem.ViewModels.LookUpViewModel 

@using (Html.BeginForm("LookUp", "Controller", "idStr", FormMethod.Post)) 
{ 
    <input type="text" name="idStr" id="idStr"/> 
    <input type="submit" value="Search" /> 
} 

@if (Model.Searchable != null && Model.AddToSearchable != null) 
{ 
    using (Html.BeginForm("AddMyStuff", "Controller")) 
    { 
     Html.HiddenFor(model => model.Searchable.SearchableId); 
     Html.HiddenFor(model => model.Searchable.AddedData); 
     Html.HiddenFor(model => model.AddToSearchable.AddToSearchableId); 
     Html.HiddenFor(model => model.AddToSearchable.SearchableId); 
     Html.HiddenFor(model => model.AddToSearchable.Searchable); 

     <div class="editor-field"> 
      @Html.EditorFor(model => model.AddToSearchable.Data) 
      @Html.ValidationMessageFor(model => model.AddToSearchable.Data); 
     </div>          

     <input type="submit" value="Submit" /> 
    } 
} 

và đây là phương pháp hành động của tôi:

public ActionResult LookUp(LookUpViewModel vm) 
{ 
    return View(vm); 
} 

[HttpPost] 
public ActionResult LookUp(string idStr) 
{ 
    int id = /*code to parse string to int goes here*/; 

    Searchable searchable = dal.GetById(id); 
    LookUpViewModel vm = new LookUpViewModel { Searchable = searchable, 
               AddToSearchable = new AddToSearchable() }; 
    //When breakpoint is set, vm contains valid references 
    return View(vm); 
} 

[HttpPost] 
public ActionResult AddMyStuff(LookUpViewModel vm) 
{ 
    //**Problem lies here** 

    //Do backend stuff 
}  

Xin lỗi vì bài viết dài. Tôi đã cố hết sức để giữ nó đơn giản. Bất kỳ đề nghị bạn có thể có .. cháy đi.

Trả lời

5

Hai phương pháp để sửa chữa nó:

  1. Bạn có thể thêm vào làm HiddenFor() cho tất cả các thuộc tính của Model.Searchable.

  2. Bạn có thể sử dụng serialization để chuyển Model.Searchable thành bản trình bày văn bản và sửa chữa nó từ biểu mẫu được tuần tự hóa trong bộ điều khiển.

Cập nhật: Vấn đề là: Bạn cần sử dụng @ Html.HiddenFor(), chứ không phải Html.HiddenFor() ;.

+0

Tôi đã thử đề xuất đầu tiên của bạn. Thật không may, điều này đã không khắc phục được sự cố của tôi. Đề xuất thứ hai của bạn có thể hoạt động, nhưng điều đó sẽ đánh bại mục đích của việc có một ViewModel. –

+0

vấn đề với đề xuất đầu tiên là gì? Bạn có thể đăng xem bằng đề xuất này không? –

+0

Mặc dù tôi cảm thấy rằng triển khai trước đó của tôi sẽ hoạt động, tôi đã cập nhật mã của mình để phản ánh thay đổi này. –

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