Tôi chắc chắn có nhiều cách để thực hiện việc này. Tôi tự hiển thị khung nhìn từ bộ điều khiển, và sau đó chuyển giao diện được hiển thị trở lại như một phần của phản hồi JSON của tôi.
Điều này bảo toàn trách nhiệm của từng pháp nhân. Chế độ xem vẫn được đặt bằng cách sử dụng công cụ xem và chúng có thể được sử dụng lại. Bộ điều khiển biết rất ít hoặc không có gì về khung nhìn ngoài tên và kiểu mô hình của nó.
Manual Rendering
public static class RenderHelper
{
public static string PartialView(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using(var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);
return sw.ToString();
}
}
}
Trong phương pháp hành động của bạn:
object model = null; // whatever you want
var obj = new {
someOtherProperty = "hello",
view = RenderHelper.PartialView(this, "_PartialName", model)
};
return Json(obj);
Lưu ý rằng tôi đang trở về một loại vô danh. Bạn có thể trả về bất kỳ loại (serializable) nào bạn muốn, miễn là nó có một thuộc tính chuỗi cho khung nhìn được hiển thị.
Kiểm tra
Thử nghiệm hành động sử dụng hiển thị thủ công yêu cầu sửa đổi nhỏ. Điều này là do hiển thị khung nhìn sớm hơn một chút so với nó sẽ được hiển thị trong đường ống MVC.
Manual Rendering
- Nhập phương pháp hành động
- Render view rõ ràng < - điều này sẽ làm cho nó khó khăn để kiểm tra hành động kêu gọi
- Exit phương pháp hành động
tự động Hiển thị
- Nhập phương pháp hành động
- Tạo một kết quả xem
- Exit phương pháp hành động
- kết quả Process view (do đó vẽ các view)
Nói cách khác, quá trình vẽ thủ công của chúng tôi khởi động một nhiều hoạt động khác gây khó khăn cho việc kiểm tra (chẳng hạn như tương tác với trình quản lý xây dựng để biên dịch chế độ xem).
Giả sử bạn muốn thử nghiệm phương thức hành động chứ không phải nội dung thực tế của chế độ xem, bạn có thể kiểm tra xem mã có đang thực thi trong môi trường được lưu trữ hay không.
public static string PartialView(Controller controller, string viewName, object model)
{
// returns false from a VS 2013 unit test, true from IIS
if(!HostingEnvironment.IsHosted)
{
// return whatever you want here
return string.Empty;
}
// continue as usual
}
Kiểm tra HostingEnvironment.IsHosted
không đắt tiền (dưới mui xe, nó chỉ đơn giản là một kiểm tra trống).
+1 Không bao giờ nghĩ về một lớp trợ giúp. Đây có thể là giải pháp thanh lịch nhất. Tôi sẽ thử. Cảm ơn. – nthpixel
Bạn không muốn làm: 'var obj = new {view = RenderHelper.PartialView (this," _PartialName ", viewModel), model = koViewModel};'? Hay đó là 'foo' là gì? Hay tôi đang thiếu một cái gì đó? – nwayve
@ Dennis - vâng, "foo" đại diện cho bất kỳ dữ liệu nào khác mà bạn cần trả lại. Tôi không chắc chắn chính xác những gì Knockout cần trên máy khách, nhưng khung nhìn cũng cần một mô hình (ngay cả khi nó là null). –