2012-03-21 25 views
57

Tôi có một vấn đề xa lạ với mô hình của tôi truyền cho XemMVC 3 Không thể chuyển chuỗi dưới dạng mô hình của Chế độ xem?

khiển

[Authorize] 
public ActionResult Sth() 
{ 
    return View("~/Views/Sth/Sth.cshtml", "abc"); 
} 

Xem

@model string 

@{ 
    ViewBag.Title = "lorem"; 
    Layout = "~/Views/Shared/Default.cshtml"; 
} 

Thông báo lỗi

The view '~/Views/Sth/Sth.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Sth/Sth.cshtml 
~/Views/Sth/abc.master //string model is threated as a possible Layout's name ? 
~/Views/Shared/abc.master 
~/Views/Sth/abc.cshtml 
~/Views/Sth/abc.vbhtml 
~/Views/Shared/abc.cshtml 
~/Views/Shared/abc.vbhtml 

Tại sao tôi không thể truyền một chuỗi đơn giản làm mô hình?

+1

Tại sao bạn sử dụng các đường dẫn tương đối đó? sử dụng này: 'View (" Sth ", null," abc ");' – gdoron

Trả lời

102

Có bạn có thể nếu bạn đang sử dụng quyền overload:

return View("~/Views/Sth/Sth.cshtml" /* view name*/, 
      null /* master name */, 
      "abc" /* model */); 
+0

Bạn nói đúng, nó hoạt động. Cảm ơn bạn – Tony

+16

Giải pháp thay thế: 'return View (" ~/Views/Sth/Sth.cshtml ", model:" abc ")' – fejesjoco

+2

Giải pháp khác: return View ("~/Views/Sth/Sth.cshtml", (đối tượng) "abc") – Jas

16

Bạn có nghĩa là View quá tải này:

protected internal ViewResult View(string viewName, Object model) 

MVC là nhầm lẫn bởi tình trạng quá tải này:

protected internal ViewResult View(string viewName, string masterName) 

Sử dụng quá tải này:

protected internal virtual ViewResult View(string viewName, string masterName, 
              Object model) 

Bằng cách này:

return View("~/Views/Sth/Sth.cshtml", null , "abc"); 

Bằng cách này, bạn chỉ có thể sử dụng này:

return View("Sth", null, "abc"); 

Overload resolution on MSDN

+1

Bây giờ tôi thấy, tôi đã sử dụng constuctor 'string viewName, object model' – Tony

+2

@Tony. Bạn có nghĩa là 'phương pháp' không constructor tôi đoán. Và 'Độ phân giải quá tải 'Có phương pháp sai (cho bạn ...) – gdoron

+0

Thậm chí chỉ việc sắp xếp chuỗi ký tự đối tượng có thể đã giúp quá trình phân giải quá tải:' return View ("Sth", (object) "abc"); ' , nhưng gọi phương thức 'Xem (chuỗi, chuỗi, đối tượng)' rõ ràng là rõ ràng hơn, trong cả hai trường hợp. –

68

Nếu bạn sử dụng tên thông số bạn có thể bỏ qua sự cần thiết phải cung cấp thông số đầu tiên hoàn toàn

return View(model:"abc"); 

hoặc

return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc"); 

cũng sẽ phục vụ mục đích này.

3

Nó cũng hoạt động nếu bạn khai báo chuỗi như một đối tượng:

object str = "abc"; 
return View(str); 

Hoặc:

return View("abc" as object); 
4

Nó cũng hoạt động nếu bạn vượt qua null cho hai tham số đầu tiên:

return View(null, null, "abc"); 
Các vấn đề liên quan