Tôi đang cố gắng triển khai các phương thức Hành động chỉnh sửa của mình với chế độ xem được nhập mạnh sẽ nhận được lớp ViewModel tùy chỉnh. Nói cách khác, tôi muốn có một ViewModel được gõ mạnh mẽ có chứa thực thể LINQ cần được chỉnh sửa cộng với một vài đối tượng khác sẽ được hiển thị trong View.ViewModel được gõ mạnh mẽ trong phương thức POST hành động chỉ chứa các giá trị rỗng
Tôi có thể nhìn thấy khung nhìn khi gọi phương thức GET Edit, nhưng phương thức POST được gõ mạnh chỉ nhận một lớp ViewModel với các tham số null và tôi không thể tìm ra cách lấy các tham số POST.
The View mẫu trông như sau:
//my custom-shaped ViewModel
public class CustomersFormViewModel
{
public SelectList AccountTypesDropDownBox;
public SelectList CountriesDropDownBox;
public Customer Customer;
}
Phương pháp hành động trông như sau:
//
// GET: /CustomersController/Edit
public ActionResult Edit(int ID)
{
var model = new CustomersFormViewModel
{
Customer = repository.Load(ID.Value),
CountriesDropDownBox = GetCountries(),
AccountTypesDropDownBox = GetAccountTypes()
};
return View(model);
}
//
// POST: /CustomersController/Edit
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(CustomersFormViewModel model)
{
//THE NEXT LINE THROWS!!!
Debug.Assert(Model.Customer!=null);
return View(model);
}
Và đây là quan điểm của tôi Chỉnh sửa:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/CustAdminMaster.master"
Inherits="System.Web.Mvc.ViewPage<Zeiterfassung.Controllers.CustomersController+CustomersFormViewModel>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
NewEdit
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>
NewEdit</h2>
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm())
{%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="FirstName">FirstName:</label>
<%= Html.TextBox("FirstName",Model.Customer.FirstName) %>
<%= Html.ValidationMessage("FirstName", "*") %>
</p>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Tôi cũng đã đã thử phương thức POST với các tham số formValues, nhưng mô hình khung nhìn vẫn không chứa tham số được đăng:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int ID, FormCollection formValues)
{
CustomersFormViewModel model = new CustomersFormViewModel();
UpdateModel(model);
//THE NEXT LINE STILL THROWS
Debug.Assert(model.Customer!=null);
return View("NewEdit",model);
}
Cách duy nhất tôi đã tìm thấy cho đến nay là viết mã của riêng mình lấy thông số đã đăng từ FormCollection và cập nhật ViewModel tùy chỉnh của tôi cho phù hợp. Nhưng cách tiếp cận này có vẻ hơi thô sơ. Có thực sự không có cách nào tốt hơn để làm điều này?
EDIT: Tôi vừa thử một cú pháp khác nhau trong giao diện như tvanfosson gợi ý, nhưng vấn đề vẫn không thay đổi:
<label for="Customer.FirstName">FirstName:</label>
<%= Html.TextBox("Customer.FirstName") %>
<%= Html.ValidationMessage("Customer.FirstName", "*") %>
Cảm ơn trả lời của bạn! "Customer.FirstName" không hoạt động, vì Khách hàng là một phần của mô hình của tôi, nhưng không phải là mô hình. Tôi giả sử bạn có nghĩa là Model.Customer.FirstName và tôi đã thử điều này (xem tôi thấy bài viết của tôi chỉnh sửa), nhưng vấn đề vẫn không thay đổi. –
Khách hàng là tài sản của mô hình của bạn để sử dụng "Customer.FirstName" là phù hợp. Nó sẽ sử dụng sự phản chiếu để tìm ra thuộc tính "Customer" trên Model của bạn, sau đó là thuộc tính "FirstName" trên nó. Bạn cũng không cần phải cung cấp giá trị nó sẽ được lấy ra từ mô hình nếu thuộc tính phù hợp được tìm thấy – tvanfosson
Tôi vừa dán các dòng chính xác từ bài đăng của bạn vào chế độ xem của tôi. Vấn đề vẫn không thay đổi. Ngoài ra, tôi đã thử đặt FirstName thành "test" trong phương thức GET action. Trường nhập liệu trống khi nhìn vào khung nhìn trong trình duyệt, vì vậy có điều gì đó sai với cú pháp bạn đã đề xuất –