2010-03-03 32 views
22

Tôi có một mô hình tương tự như sau:Việc trả lại EditorTemplate như một PartialView trong một quả Hành động - ASP.Net MVC 2

public class myModel 
{ 
    public ClassA ObjectA {get; set;} 
    public ClassB ObjectB {get; set;} 
} 

Trong giao diện chính của tôi, tôi có thẻ tương tự như sau:

<div id="section1"> 
    <%=Html.EditorFor(m => m.ObjectA)%> 
</div> 
<div id="section2"> 
    <%=Html.EditorFor(m => m.ObjectB)%> 
</div> 

ClassA và ClassB đều có mẫu Trình chỉnh sửa được xác định.

Tôi đã tạo một số JavaScript thực hiện cuộc gọi AJAX để tải lại phần 1 div. Tôi muốn phương thức action trả về trình soạn thảo cho ObjectA, ClassA.ascx nằm trong thư mục EditorTemplates.

Tôi có sau trong phương pháp hành động của tôi:

public ActionResult GetData(int input) 
{ 
    // Process input here and create modelData 

    return PartialView("ClassA", modelData); 
} 

này đưa ra một lỗi bởi vì nó không thể tìm thấy điểm ClassA.

Giải pháp của tôi là tạo một PartialView trong thư mục Views được gọi là "GetData" và trả về của tôi hiển thị chế độ xem GetData. Chế độ xem GetData chỉ có một dòng mã:

<%=Html.RenderForModel()%> 

Điều này có hiệu quả, nhưng tôi đã tự hỏi liệu có cách nào để phương thức hành động trả về và chỉnh sửa mẫu không?

Nhờ bất kỳ đề xuất nào bạn có thể cung cấp.

Trả lời

23
return PartialView("~/EditorTemplates/ClassA.ascx", modelData); 
+0

Đó không hoạt động. Nó vẫn không thể tìm thấy mẫu. Tuy nhiên, nó xuất hiện mà nó chỉ tìm kiếm vị trí "~/EditorTemplates/ClassA.ascx", mà tôi đã không mong đợi. –

+4

Tuy nhiên, việc cung cấp đường dẫn đầy đủ từ gốc ứng dụng không hoạt động. Ví dụ: "~/Views/MyView/EditorTemplates/ClassA.ascx". Tôi không biết bạn có thể làm điều này. –

+0

Có cách nào để chế độ xem hiển thị chính khuôn mẫu đó không? Nói nếu 'modelData' là loại' ClassA'? – Shimmy

27

điểm thưởng cho gói quà:

public class CustomControllerBase : Controller 
{ 
    public PartialViewResult EditorFor<TModel>(TModel model) 
    { 
     return PartialView("EditorTemplates/" + typeof(TModel).Name, model); 
    } 

    public PartialViewResult DisplayFor<TModel>(TModel model) 
    { 
     return PartialView("DisplayTemplates/" + typeof(TModel).Name, model); 
    } 
} 

Có bộ điều khiển (gọi tắt là, nói, MyController) kế thừa từ CustomControllerBase, và sau đó:

public ActionResult MyAction(int id) 
{ 
    return EditorFor(new MyViewModel(id)); 
} 

Mã sẽ được tìm kiếm "~/Views/MyController/EditorTemplates/MyViewModel.ascx".

+1

Bất kỳ cách nào để đính kèm đối tượng mới được tạo vào thuộc tính bộ sưu tập của mô hình gốc? – Shimmy

1

này làm việc cho tôi (MVC 4)

public ActionResult GetData(int input) 
{ 
    // Process input here and create modelData 

    return PartialView("EditorTemplates/ClassA", modelData); 
} 
Các vấn đề liên quan