2012-08-13 48 views
2

假設我有一個類'Location',並且我使用MVC3來創建一個腳手架列表(索引。 CSHTML)。索引html頁面使用@model IEnumerable。如果我想添加一個新的位置到列表中,我按下了create,然後我使用@model Project.Models.Location結束了一個新的html頁面。如何在同一頁面(List/Create)使用@model IEnumerable <>和@model <> MVC3

而不是去一個新的頁面,我想創建頁面作爲使用模式在boostrap(twitter)彈出。我已經嘗試使用partialview沒有任何運氣。無論我做什麼,我都會收到字典錯誤消息。

傳遞到字典中的模型項類型爲'System.Data.Entity.Infrastructure.DbQuery`1 [Project.Models.Location]',但是此字典需要類型爲'Project.Models.Location'的模型項」。

模態(引導程序)本身正在工作,當我不提取partialview。 partialview本身與生成的create(CRUD)完全相同。

編輯:我重寫了整個事情。

指數:

@model IEnumerable<LoLStats.Models.Location> 

@{ 
    ViewBag.Title = "Index"; 
} 
@foreach (var item in Model) { 
    <ul> 
     <li>@Html.DisplayFor(modelItem => item.LocationName)</li> 
    </ul> 
} 

<a class="btn" data-toggle="modal" href="#myModal" >Create</a> 

<div class="modal hide" id="myModal"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal">×</button> 
    <h3>Modal header</h3> 
    </div> 
    <div class="modal-body"> 
    <p>@Html.Partial("_createLocation")</p> 
    </div> 
    <div class="modal-footer"> 
    <a href="#" class="btn" data-dismiss="modal">Close</a> 
    <a href="#" class="btn btn-primary">Save changes</a> 
    </div> 
</div> 

_createLocation:

@model LoLStats.Models.Location

@ { ViewBag.Title = 「創建」; }

@using(Html.BeginForm()){ @ Html.ValidationSummary(真) 位置

<div class="editor-label"> 
     @Html.LabelFor(model => model.LocationName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.LocationName) 
     @Html.ValidationMessageFor(model => model.LocationName) 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> } 
+0

你拼寫的項目錯誤'Prosject.Models.Cars' – JoonasL 2012-08-13 17:52:57

+0

這不是問題。我沒有準確的錯誤消息,所以我寫了它。但是,無論如何感謝:) – sindrem 2012-08-13 17:55:28

+0

請同時發佈您當前的代碼 – JoonasL 2012-08-13 17:56:31

回答

0

彈出窗口需要有定義爲Project.Models.Car模型(單項目)。成功保存單個項目後,您需要更新原始列表視圖。你可以通過在DOM中插入一個新項目或者通過導航到給出列表的動作來刷新頁面來使用jQuery。

+0

在我更新我的帖子後,這仍然算數嗎? Sry關於那btw – sindrem 2012-08-13 18:09:10

+0

我的方法和包含複合視圖模型的答案都以不同的方式實現相同的結果。在MS代碼中,總有476種方法讓皮膚變白:-) – 2012-08-13 19:00:49

+0

就我個人而言,我傾向於打破我的UI,以減少耦合。我喜歡有2個特定的視圖,一個用於列表,另一個用於編輯。保存新項目後,我將重定向回列表。但那只是我。 – 2012-08-13 19:04:20

2

你可以做一個具有兩個屬性視圖模型:

  • 了IEnumerable父視圖
  • 的模態奇異對象

然後強類型兩種觀點的看法模型,你應該全部設置。

編輯

視圖模型:

public class MyViewModel() 
{ 
    public IEnumerable<LoLStats.Models.Location> Locations {get; set;} 
    public LoLStats.Models.Location Location {get; set;} 
} 

指數:

@model myNamespace.MyViewModel 
... 
@foreach (var item in Model.Locations) { 
    <ul> 
     <li>@Html.DisplayFor(modelItem => item.Locations.LocationName)</li> 
    </ul> 
... 

_createLocation:

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

希望這是足夠的細節,讓你去

+0

我不知道該怎麼做,而谷歌正在讓我失望。 – sindrem 2012-08-13 18:17:11

+0

@sindrem我會用一些細節更新我的答案。 – 2012-08-13 18:19:44

+0

從最佳實踐的角度來看,儘量避免使用'@model IEnumerable​​',I.E.泛型類型。最好的做法是創建專用於此特定視圖的視圖模型(每個視圖通常爲1個視圖模型),並在其中包含所有視圖需要顯示並回傳給您的控制器。 – 2012-08-13 18:45:54

1

嘗試這種在索引視圖:

... <p>@Html.Partial("_createLocation", Model.FirstOrDefault())</p> 

,另一方面,也許這會讓更多的SENCE:

... <p>@Html.Partial("_createLocation", new LoLStats.Models.Location())</p> 

希望它爲你工作。

相關問題