不知道爲什麼我放棄了投票,但是我會在做一些研究和測試之後重新編寫我的問題。這是我用來學習MVC/EF/Repository/Bootstrap等的一個輔助項目。我每週只在這裏花幾個小時在這裏工作。我應該使用ViewBag將列表傳遞給View嗎?
基本原題:
我知道我真的應該使用一個ViewModel列表<>來傳遞數據的看法,但我不知道它是如何或是否符合我的要求。
我想要做的是得到一個用戶列表顯示在一個表中,每個表中都有一個複選框。在該表格上方,我想要列出可以分配到的組的列表。您從DropDownList(DDL)中選擇部分,然後檢查您想要分配給誰。這是我想要分配爲列表並傳遞給視圖的組/部分。
所以,我有一個列表的ViewModel,我正在使用一個存儲庫來填充虛擬機。我不知道該怎麼做,到底是在哪裏/何時向每個虛擬機對象填充該列表,即使我做了也有50個用戶,我不想讓50次訪問數據庫來獲取相同的信息這就是爲什麼我認爲在這種情況下使用ViewBag將該組列表傳遞給View可能是合理的。另一方面,我想了解如何在虛擬機中正確填充該列表以供將來編碼。
更新問題/代碼:
所以,更多的研究和下面的一些建議後,我現在已經得到了下面的代碼。我仍然不確定如何正確填充我的ViewModel中的巡視以便在View中填充DDL。
目前,我已經看到顯示錶格與複選框。現在我回過頭來研究如何獲取值來填充DDL,然後我必須發佈到控制器,循環查找檢查行並更新數據庫。在我的情況下,每個成員記錄默認爲PatrolId = 0,並且此頁面應允許我將PatrolId更新爲DDL中的值。
PatrolMemberViewModel中的Patrols屬性應該是我從數據庫表中取出的約5條記錄的列表,而不是DDL中的硬編碼。
視圖模型:
public class PatrolViewModel
{
public int PatrolId { get; set; }
public string PatrolName { get; set; }
}
public class PatrolMemberViewModel
{
[Key]
public int MemberId { get; set; }
public int PatrolId { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Phone")]
public string PhonePrimary { get; set; }
[Display(Name = "Email")]
public string EmailPrimary { get; set; }
public bool IsSelected { get; set; }
public PatrolViewModel Patrols { get; set; }
}
控制器:
public ViewResult Unassigned()
{
try
{
IEnumerable<PatrolMemberViewModel> model = repository.SelectAllUnassigned();
return View(model);
}
catch (Exception)
{
ModelState.AddModelError(string.Empty, "Error retrieving the record.");
return View();
}
}
庫:
public IEnumerable<PatrolMemberViewModel> SelectAllUnassigned()
{
using (DataContext db = new DataContext())
{
var results = (from p in db.Person
where p.IsActive == true
&& p.IsScout == true
&& p.PatrolId == 0
select new PatrolMemberViewModel
{
MemberId = p.PID,
FirstName = p.FirstName ?? string.Empty,
LastName = p.LastName ?? string.Empty,
EmailPrimary = p.EmailPrimary ?? string.Empty,
PhonePrimary = p.PhonePrimary ?? string.Empty,
PatrolId = p.PatrolId,
IsSelected = false
}
).OrderBy(o => o.LastName).ThenBy(o => o.FirstName).ToList();
return results;
}
}
查看:
@model IList<ProjectName.ViewModels.PatrolMemberViewModel>
@{
ViewBag.Title = "Unassigned";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Patrols</h2>
@using (Html.BeginForm("Update", "Patrol", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(false, "", new { @class = "alert alert-danger" })
<table class="table table-bordered table-striped table-hover table-condensed tbackground">
<tr>
<th class="text-center">
</th>
<th class="text-center">
First Name
</th>
<th class="text-center">
Last Name
</th>
<th class="text-center">
Email
</th>
<th class="text-center">
Phone
</th>
</tr>
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td class="text-center">
@Html.CheckBoxFor(m => m[i].IsSelected)
</td>
<td>
@Html.DisplayFor(m => m[i].FirstName)
</td>
<td>
@Html.DisplayFor(m => m[i].LastName)
</td>
<td>
<a href="mailto:@Model[i].EmailPrimary">@Model[i].EmailPrimary</a>
</td>
<td class="text-center">
@Html.DisplayFor(m => m[i].PhonePrimary)
</td>
</tr>
}
</table>
<div class="control-wrapper">
<input type="submit" id="btnSubmit" value="Assign" class="btn btn-success" />
</div>
}
<p> </p>
對數據庫進行50次調用與ViewBag vs ViewModel解決方案無關。這是關於你如何查詢.http://stackoverflow.com/questions/33921262/is-deferred-execution-in-asp-net-mvc-view-a-very-bad-thing/33921573#33921573 – Shyju
@Shyju ...你能看看我在我的問題中發佈的更新,看看你能告訴我做錯了什麼嗎?感謝... – Caverman
將您的_ users_和_list_ Groups列表關聯到您所顯示的代碼(這與'MemberSectionViewModel'和'Sections'和'PatrolViewModel'和'MemberPatrolViewModel'有什麼關係? –