2009-08-24 30 views
5

Chế độ xem của tôi sử dụng ModelX để hiển thị biểu mẫu HTML và thao tác điều khiển của tôi lấy ModelY làm đầu vào khi lưu biểu mẫu. Dường như API hộp văn bản loại an toàn giả định tôi đang sử dụng cùng một mô hình ở cả hai nơi.ASP.NET MVC - Typesafe Html.TextBoxFor với outputmodel khác nhau

Có thể sử dụng các kiểu máy khác nhau và kiểu nuôi ong an toàn mà không cần tạo người giúp đỡ của riêng tôi không?

<% = Html.TextBoxFor(x => x.Text) %>

Tôi muốn một cái gì đó như thế này. Nó tồn tại ?

<% = Html.TextBoxFor<InputModel,OutputModel>(input=>input.Text, output=>output.SomeOtherText) 

Trả lời

1

Có thể sử dụng mô hình khác nhau và beeing an toàn mà không cần tạo kiểu giúp đỡ của riêng tôi?

Chỉ bằng cách sử dụng kế thừa. Vì vậy, bạn sẽ có mô hình cơ sở với tất cả các thuộc tính.

Cân nhắc XForms.
Nhưng tôi không thực sự hiểu mục đích của InputModel và OutputModel trong mẫu.

+0

Làm thế nào về một số ví dụ trong XForms áp dụng cho trường hợp của anh ấy. –

+0

Bạn có thể đưa ra một mẫu ** thực ** của những gì bạn muốn làm không? Tôi không thực sự hiểu những gì bạn đang cố gắng đạt được (mô hình đầu vào và đầu ra?). –

+1

Dmitriy Nagirnyak: Ý tưởng là bạn sử dụng một mô hình để điền vào chế độ xem. Bạn có thể không sử dụng cùng một mô hình để lưu dữ liệu từ chế độ xem. Họ là những mối quan tâm khác nhau. – BjartN

13

Tôi đã tìm thấy giải pháp liên quan đến việc tạo trình trợ giúp html mới. OP là đúng khi nói rằng đôi khi không thích hợp để sử dụng cùng một lớp làm tham số cho phương thức hành động cũng như trang xem. Đôi khi, chúng tôi muốn chuyển thông tin THÊM cho ViewPage so với những gì người dùng trả lại cho chúng tôi trong bài đăng biểu mẫu.

Các giải pháp tôi đưa ra là sử dụng một phương pháp mở rộng HtmlHelper, mà tôi gọi là HtmlHelperFor (T obj) mà tôi sử dụng như sau:

<% var productForm = Html.HtmlHelperFor(Model.Product); %> 

và sau đó tôi sử dụng nó như dưới đây:

<%= productForm.TextBoxFor(x => x.Name) %> 

phương pháp mở rộng là dưới đây:

public static HtmlHelper<T> HtmlHelperFor<T>(this HtmlHelper html, T model) 
{ 
    var newViewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) { Model = model }; 
    ViewContext newViewContext = new ViewContext(html.ViewContext.Controller.ControllerContext, html.ViewContext.View, newViewData, html.ViewContext.TempData, html.ViewContext.Writer); 
    var viewDataContainer = new ViewDataContainer(newViewContext.ViewData); 
    return new HtmlHelper<T>(newViewContext, viewDataContainer, html.RouteCollection); 
} 

các ViewDataContainer là một thực hiện các IVI giao diện ewDataContainer tìm thấy trong Sysetm.Web.Mvc:

public class ViewDataContainer : System.Web.Mvc.IViewDataContainer 
{ 
    public ViewDataContainer(System.Web.Mvc.ViewDataDictionary viewData) 
    { 
     ViewData = viewData; 
    } 

    public System.Web.Mvc.ViewDataDictionary ViewData { get; set; } 
} 

các cuộc gọi trên sẽ cho phép bạn có một đối tượng Product như một phần của các thông số của phương pháp mà chấp nhận POST, thay vì một lớp học, trong đó có dự án mà bạn thường sẽ chuyển sang chế độ xem của bạn.

+1

Cảm ơn bạn đã hiển thị giải pháp của mình! Tôi đang nghĩ đến việc mở rộng ý tưởng bằng cách tạo ra một cái gì đó giống như 'ScopedMvcForm' và một trình trợ giúp tương ứng' BeginScopedForm'.Tôi muốn có thể viết: 'sử dụng (var form = BeginScopedForm (Model.Product)) {form.TextBoxFor (...)}' – Ragge

+1

Tôi sẽ upvote này một loạt các lần nếu tôi có thể. Nó không chỉ trả lời một câu hỏi trực tiếp mà tôi có (cách thực hiện tương tự câu hỏi mô tả mà còn cho 'DisplayNameFor'), nhưng nó cũng cung cấp một cửa sổ tốt về cách tạo HtmlHelper và cách tạo ra một khung nhìn hiện có . – daveaglick

+0

@TahirHassan làm thế nào chúng ta có thể làm tương tự cho ASP.NET Core? – tchelidze

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