2013-01-25 32 views
7
@model MyMVC.Models.MyMVC.MyModel 

@{ 
    ViewBag.Title = "Index"; 
} 

Lý do tại sao tôi đặt câu hỏi này là trong MVC, chúng tôi có thể có nhiều hơn 1 biểu mẫu, vì vậy tôi muốn có một mô hình cho mỗi biểu mẫu. Nhưng khi tôi cố gắng thêm một mô hình khác ở đầu chế độ xem, nó sẽ hiển thị lỗi. Tôi biết chúng tôi có thể sử dụng ViewModel có model1 và model2 bên trong, nhưng đó không phải là câu hỏi tôi yêu cầu.Chế độ xem Dao cạo có nhiều hơn một mô hình mà không cần sử dụng đối tượng ViewModel không?

Tôi chỉ đơn giản muốn biết là có bất kỳ cách nào mà chúng tôi có thể đưa vào 2 mô hình thành 1 chế độ xem.

Cập nhật:

Ví dụ, tôi muốn có 2 hình thức trong quan điểm của tôi, vì vậy đối với từng loại hình, tôi muốn có một mô hình riêng biệt.

Cập nhật 2 Cảm ơn tất cả các bạn đã trả lời. Bây giờ tôi biết rằng MVC chỉ hỗ trợ một mô hình duy nhất trên một chế độ xem. Các bạn có coi đây là bất lợi của MVC không? (Chưa ai trả lời câu hỏi đó ... tại sao?)

Câu trả lời của bạn tương tự, vì vậy tôi thậm chí không biết câu trả lời nào nên được đặt làm câu trả lời.

+0

Trong khi mỗi Chỉ xem có thể có một mẫu, bạn có thể có PartialViews trong vòng một Lượt xem. Mỗi PartialView có thể có mô hình riêng của nó. Trong ví dụ của bạn, mỗi biểu mẫu sẽ là một phần của riêng nó. – drovani

+0

@drovani thx để trả lời của bạn. Bạn có thể thể hiện ý tưởng của mình bằng mã không? – Franva

+0

Cân nhắc sử dụng @ Html.Partial() thay vì đề xuất trong câu trả lời được chấp nhận. Có thể có vấn đề với @Html.RenderAction, vì nó sẽ tìm kiếm một tuyến điều khiển và sau đó render 'partial' như một view hoàn chỉnh. Điều này có thể sẽ tải _Layout.cshtml hai lần trong trang của bạn! – mschr

Trả lời

10

Bạn nên sử dụng một số prtialviews cho các mô hình khác. Bạn có quan điểm chính của bạn với mô hình chính. Bên trong quan điểm đó, bạn có thể có một số xem xét một phần với mô hình của họ và xác nhận của họ.

-------------------------------------- Chỉnh sửa:

Như những người khác nói tốt hơn là nên sử dụng Mô hình Xem và kết hợp các mô hình với nhau.Nhưng khi bạn muốn tôi tạo ra một dự án mẫu cho bạn trên tài khoản Github tôi:

https://github.com/bahman616/ASPNET_MVC_multiple_models_in_a_view_with_partialview.git

Đây là mã đơn giản của dự án:

Dưới đây là hai mô hình:

public partial class Person 
{ 
    public int ID { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 
public partial class Company 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

Tôi muốn có cả chế độ xem trong một chế độ xem, vì vậy đây là chế độ xem gốc:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Person 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm("Create","Person")) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@{Html.RenderAction("_CompanyCreate", "Company");} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

Và đây là chế độ xem một phần:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Company 

<script src="~/Scripts/jquery-1.7.1.min.js"></script> 
<script src="~/Scripts/jquery.validate.min.js"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

@using (Html.BeginForm("_CompanyCreate","Company")) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Company</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 
+0

Xin chào Bahman, thx cho câu trả lời của bạn. Bạn có thể vui lòng thể hiện ý tưởng của bạn với một số mã? – Franva

+0

Xin chào Franva, vui lòng xem các cập nhật. – Bahman

+0

Hi Bahman Nikkhahan. Cảm ơn bạn rất nhiều vì đã trả lời của bạn. Với sự sẵn sàng tuyệt vời của bạn và thậm chí là một dự án demo, huy chương chắc chắn là của bạn !!! Tôi sẽ yêu cầu sự giúp đỡ của bạn nếu tôi không thể tìm ra mã của bạn. Chúc mừng :) – Franva

6

Câu trả lời đơn giản: Không, bạn không thể có hai mô hình.

Chi tiết Chỉ có một cách để tuyên bố một mô hình được sử dụng bởi một cái nhìn:

@model [namespace].[path].[ViewModelName] 

Không có cách nào để xác định nhiều trong số này ở trên.

Bên cạnh đó, bạn chỉ có thể gửi một đối tượng đến một cái nhìn từ Controller, đó sẽ là mô hình:

public ActionResult WhateverAction() 
{ 
    var model = new MyViewModel(); 
    return View(model); 
} 
+0

rõ ràng và sạch sẽ :) thx – Franva

1

Trả lời là KHÔNG. Đó là lý do tại sao mẫu ViewModel tồn tại. bởi vì động cơ dao cạo hoàn toàn dựa vào mô hình bạn đã vượt qua, mô hình được sử dụng cho ModelBinding cho các hoạt động CRUD cơ bản.

+0

thx để trả lời :) – Franva

2

Về mặt kỹ thuật, bạn có thể viết công cụ xem của riêng bạn (bắt nguồn từ RazorViewEngine?) Bằng cách sử dụng một WebViewPage tùy chỉnh và có nó làm bất cứ điều gì bạn muốn. Chế độ xem có nguồn gốc từ WebViewPage<T> trong đó T là loại mô hình cho trang. Để hỗ trợ nhiều mô hình, lớp cơ sở chế độ xem sẽ cần phải có nhiều loại chung chung. Tuy nhiên, khi sử dụng nướng trong RazorViewEngine, bạn bị giới hạn ở một kiểu mô hình duy nhất cho mỗi khung nhìn và phần lớn khung điều khiển giả định một mô hình duy nhất cho mỗi lần xem, do đó bạn cũng phải viết lại nó. Tuy nhiên, dường như không có nhiều điểm, vì bạn có thể đơn giản có các mô hình của bạn là các thuộc tính của mô hình xem (single), sau đó sử dụng các khung nhìn từng phần cho mỗi biểu mẫu cung cấp thuộc tính làm mô hình cho một phần.

Để biết thêm thông tin, xem http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx

+0

wow, điều đó sẽ quá khó với tôi> _ <; nhưng cảm ơn bạn anyway và tôi chắc chắn muốn xem xét thông qua đề xuất của bạn. – Franva

3

Về mặt lý thuyết bạn không thể làm điều đó bởi vì nó liên kết với một mô hình được xem một video. Nhưng bạn có thể tạo somethink như một helper mô hình kết hợp hai mô hình khác để một

public class model1 
{ 
    string var1 {get; set;} 
    string var2 {get; set;} 
} 

public class model2 
{ 
    string var3 {get; set;} 
    string var4 {get; set;} 
} 

public class modelofBoth 
{ 
    model1 mod1 {get; set;} 
    model2 mod2 {get; set;} 
} 
+0

THx Code Told :) Đây là một cách khả thi, giống như các lớp ViewModel trong mẫu thiết kế MVVM – Franva

3

Nếu bạn không thể/không muốn thay đổi mô hình thông qua để xem sau đó bạn có thể vượt qua các đối tượng bổ sung trong qua ViewBag vật. Nó cảm thấy như một hack với tôi nhưng nó hoạt động:

Bộ điều khiển:

ViewBag["Model2"] = yourObject 

Xem:

@{var Model2 = ViewBag["Model2"] as yourObjectType;} 
0

Bạn có thể dễ dàng có 1 mô hình theo mẫu. Đối với mỗi biểu mẫu, bạn chỉ cần thực hiện một việc như sau:

var model = new MyModel(); 
@Html.TextBoxFor(m => model.Title) 
@Html.ValidationMessageFor(m => model.Title) 

Xác thực hoạt động như một sự quyến rũ.

Bằng cách này, bạn có thể giữ mô hình của bạn để hiển thị thông tin như bình thường và có 1 mô hình mỗi mẫu này để gửi dữ liệu (cho thuê bao dụ bản tin)

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