2013-07-17 99 views
0

夥計們我試圖使用單個視圖的多個模型。如何將單個視圖綁定多個模型?

但我找不到解決方案如何實現它。

我想使用單過去,另一個在另一部分之一查看數據..

我用下面的代碼..

這是一個觀點

@Html.Partial("Sidebar") 

這是另一種觀點

<!-- start content --> 
    <div id="content"> 
     <div class="post"> 
      <h1 class="title"> 
       Add New Post 
      </h1> 

<p></p> 
      <div class="entry"> 
       @using (Html.BeginForm()) 
       { 
        <div> 
         <div style="display:inline;"> 
          <div style="display: inline; float: left;"> 
           @Html.Label("lblcategory", "Category", new { style = "Width:100px; float: left;" }) 
           <div style="width: 150px; height: 60px; overflow-y: scroll; display: inline; float: left;"> 
            @for (int i = 0; i < (int)TempData["Rows"]; i++) 
            { 
             for (int j = 0; j < (int)TempData["Cols"]; j++) 
             { 
              <input id="Checkbox + @i" name = "Category" type="checkbox" style="width:50px;" value="@TempData["[" + i.ToString() + "][" + j.ToString() + "]"]"/> 
              @TempData["[" + i.ToString() + "][" + j.ToString() + "]"] 
             } 
            }         
            @*@Html.LabelFor(model => model.CategoryName)*@ 
           </div> 
           <div style="float:right;"> 
            <label id="lblcategoryrequired" style="color:Red">@Html.ValidationMessageFor(model => model.CategoryName)</label> 
           </div> 
          </div> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblsubjet", "Subject", new { style = "Width:100px; float: left;" }) 
           @*@Html.TextBox("txtsubject", "", new { style = "Width:700px;" })*@ 
           @Html.TextBoxFor(model => model.PostSubject, new { style = "Width:400px; maxlength=400;" }) 
           <label id="lblsubjectrequired" style="color:Red">@Html.ValidationMessageFor(model => model.PostSubject)</label> 
          </p> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblcontent", "Content", new { style = "Width:100px; float: left; Vertical-align:top;" }) 
           @*@Html.TextArea("txtcontent","", new { style = "Width:700px; height:200px; maxlength=700;" })*@ 
           @Html.TextAreaFor(model => model.PostContent, new { style = "Width:400px; height:200px; maxlength=400;" }) 
          </p> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblblank", "a", new { style = "Width:100px; float: left; Color:#372412" }) 
           <input type="submit" value="Add" id="btnadd" style="width: 100px;" class="button" /> 
           &nbsp&nbsp&nbsp&nbsp 
           <a id="Cancel" href="~/Home/Home"> <input type="button" value="Cancel" id="btncancel" class="button" style="width: 100px;" /></a> 
          </p> 
         </div> 
        </div> 
        @Html.ValidationSummary(true) 
       } 
      </div> 
     </div> 
    </div> 
</div> 
+1

你可以有既有車型視圖模型,你可以綁定,以你的觀點 –

回答

0

您應該使用視圖模型來表示所需的數據呈現您的視圖。您可以直接在視圖模型上展示模型(違反LoD),或將視圖模型的調用委託給基礎模型(違反DRY原則)。

+0

雅夥計,我已經使用了模型@model BloginMVC.Models.PostModel @ { ViewBag.Title =「AddPost」; Layout =「〜/ Views/MasterView/MasterLayout.cshtml」; }但它不去引用部分視圖的GET方法(如邊欄)...... –

+0

「它不去引用GET方法」 - 我不知道你是什麼意思。如果您希望將模型傳遞給部分,則可以使用例如@ Html.Partial(「Sidebar」,model.SidebarModel)。請參閱http://msdn.microsoft.com/en-us/library/ee402926(v=vs.108).aspx – devdigital

+0

我只想說我使用One View來顯示兩部分的數據。在左邊我想顯示來自PartialView的數據,其中我使用了1模型&在其他部分中我想顯示來自同一視圖的數據,其中我使用了另一個模型,但問題是當視圖加載時它調用ActionResult方法的視圖類型的GET,但是當它渲染PartialView時,它並沒有調用ActionResult的PartialView的GET類型的方法,並給出錯誤,如對象引用未設置爲我在部分視圖中使用的MODEL對象的實例。 –

1

我不明白你的問題100%。但如果我理解它,那麼我認爲它不會按照你需要的方式工作(我可能會誤解)。我建議你遠離你的局部視圖,只傳入一個view model,你可以用它來填充這兩個部分。查看模型可以在視圖上表示您的數據。

我打算給你一個基本的樣本,你可以在你的場景中修改和使用。比方說,我們有一個客戶,這個客戶可以有一個或多個地址。所以這2種型號的基本表示看起來是這樣的:

public class Customer 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public IEnumerable<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 

    public string AddressLine1 { get; set; } 

    public string AddressLine2 { get; set; } 

    public string AddressLine3 { get; set; } 
} 

現在您詳細查看您想要顯示客戶的詳細資料和這個客戶的地址。所以我們有2個模型(客戶和地址),您在1個視圖中顯示。

public ActionResult Details(int id) 
{ 
    Customer customer = customerRepository.GetById(id); 

    if (customer != null) 
    { 
      customer.Addresses = addressRepository.GetAddressesForCustomer(customer.Id); 
    } 

    // The above 2 steps can be done in 1 repository call 

    // Now populate your view model with the above details 
    // This can also be 1 or 2 lines when you use something like Auto Mapper 

    CustomerDetailsViewModel viewModel = new CustomerDetailsViewModel 
    { 
      viewModel.CustomerId = customer.Id, 
      viewModel.CustomerFirstName = customer.FirstName, 
      viewModel.CustomerLastName = customer.LastName, 
      viewModel.CustomerAddresses = customer.Addresses 
    }; 

    return View(viewModel); 
} 

您的視圖模型:

public class CustomerDetailsViewModel 
{ 
    public int CustomerId { get; set; } 

    public string CustomerFirstName { get; set; } 

    public string CustomerLastName { get; set; } 

    public IEnumerable<Address> CustomerAddresses { get; set; } 
} 

所以,現在你有1個視圖模型從2個不同的車型填充。現在你所要做的只是使用這個視圖模型來顯示數據:

@model YourProject.ViewModels.Customers.CustomerDetailsViewModel 

@Model.CustomerId<br /> 
@Model.CustomerFirstName<br /> 
@Model.CustomerLastName<br /><br /> 

@foreach (var address in @Model.CustomerAddresses) 
{ 
    <div> 
      @address.Id<br /> 
      @address.AddressLine1<br /> 
      @address.AddressLine2<br /> 
      @address.AddressLine3<br /> 
    </div> 
} 

我希望這有助於。

+0

+1 Defo我會做什麼。 –

+0

謝謝Brendan ..它肯定會幫助我...現在我明白了。 –

+0

然後將其標記爲已接受的答案:) –

相關問題