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.
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. –
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? –
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. –