在我的控制器中,我有一個包含2種不同模型的ViewModel,名爲Drug and Food。帶有ViewModel的ASP.NET MVC5控制器CRUD(2個模型)
public class FoodDrugViewModel {
public IEnumerable<SGHealthDesktop.Models.Drug> Drugs { get; set; }
public IEnumerable<SGHealthDesktop.Models.Food> Foods { get; set; }
}
在我的MainController中,這是我將ViewModel傳入索引的方式。
// GET: Admin
public ActionResult Index() {
FoodDrugViewModel vm = new FoodDrugViewModel(); //initialize it
vm.Drugs = db.Drugs.ToList();
vm.Foods = db.Foods.ToList();
return View(vm);
}
在我看來,我創建了兩個表格,並在每個模型中圈出項目,就像這樣。
<table class="table" id="drugTable">
<thead>
<tr>
<th>Drug Name</th>
<th>Dosage</th>
<th>Unit</th>
<th>Type</th>
</tr>
</thead>
@foreach (var item in Model.Drugs) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.DrugName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Dosage)
</td>
<td>
@Html.DisplayFor(modelItem => item.Unit)
</td>
<td>
@Html.DisplayFor(modelItem => item.Type)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.DrugId }) |
@Html.ActionLink("Details", "Details", new { id = item.DrugId }) |
@Html.ActionLink("Delete", "Delete", new { id = item.DrugId })
</td>
</tr>
}
</table>
@foreach (var item in Model.Foods) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FoodName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Protein)
</td>
<td>
@Html.DisplayFor(modelItem => item.Carbohydrate)
</td>
<td>
@Html.DisplayFor(modelItem => item.TotalFat)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.FoodId }) |
@Html.ActionLink("Details", "Details", new { id = item.FoodId }) |
@Html.ActionLink("Delete", "Delete", new { id = item.FoodId })
</td>
</tr>
}
爲了防止這兩個表顯示,從在同一時間,我用伴有JQuery的一個下拉列表,以便用戶可以選擇查看哪個表,它的工作如預期。 但是,我的問題如下。當我點擊「Details」ActionLink或3個ActionLinks(細節,編輯,刪除)中的任何一個時,我希望顯示相關信息。例如,如果我正在查看藥物表,並且如果點擊「詳細信息」,則詳細信息視圖將顯示藥物信息,並且食品也是如此。
但是,我似乎無法弄清楚如何實現。我的詳細方法如下,藥物仍然是主要模型。如何檢測用戶是否選擇查看藥物或食物的細節?正如您在代碼中看到的那樣,它立即根據id找到Drug details。
// GET: Admin/Details/5
public ActionResult Details(int? id) {
if (id == null) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Drug drug = db.Drugs.Find(id);
if (drug == null) {
return HttpNotFound();
}
return View(drug);
}
至於創建,有一個與它沒有任何問題,我可以再次,允許一個下拉列表,以便用戶可以選擇什麼類型,藥物或食品,他們希望創建和表格將被分別顯示(假設視圖我正在使用FoodDrugViewModel而不是Drug模型)。但是我怎麼能在控制器中綁定數據呢?默認情況下,Create方法如下。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "DrugId,DrugName,Dosage,Unit,Type")] Drug drug) {
if (ModelState.IsValid) {
db.Drugs.Add(drug);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(drug);
}
任何幫助呈現將不勝感激。提前致謝!
UPDATE:上創建()
在創建視圖的問題,我宣佈FoodDrugViewModel如下
@model SGHealthDesktop.ViewModels.FoodDrugViewModel
而且我的藥表格看起來像這樣(食品也是如此)。
<div id="drugDiv">
<div class="form-group">
@Html.LabelFor(model => model.Drug.DrugName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Drug.DrugName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Drug.DrugName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Drug.Dosage, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Drug.Dosage, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Drug.Dosage, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Drug.Unit, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Drug.Unit, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Drug.Unit, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Drug.Type, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Drug.Type,
new SelectList(new[]
{ "Diabetic Medication", "Hypertension", "Kidney Disease", "Insulin", "High Cholesterol"
}) as SelectList, new { @class = "btn btn-default dropdown-toggle form-control" })
@Html.ValidationMessageFor(model => model.Drug.Type, "", new { @class = "text-danger" })
</div>
</div>
</div>
我的Create()方法是遵循
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "DrugName,Dosage,Unit,Type")] FoodDrugViewModel vm) {
try {
if (ModelState.IsValid) {
if (vm.Drug != null) {
db.Drugs.Add(vm.Drug);
}
db.SaveChanges();
return RedirectToAction("Index");
}
} catch (DataException dex) {
//Log the error (uncomment dex variable name and add a line here to write a log.
System.Diagnostics.Debug.WriteLine(dex);
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
return View(vm.Drug);
}
我把一個斷點在該行的方法被調用,以及「藥品」爲空。我可以知道我哪裏錯了嗎? :(
這是可能的,但它不是一個好主意,使用一個行動的藥物和食物。在維護方面,還應該分別實施幾件事。 –
爲什麼不用''Details(int id)''''Edit(int id)''方法''FoodController'和'DrugController'是一樣的?通過使用Ajax爲您的集合加載partials視圖,而不是將所有數據發送到視圖時,您可以大大提高性能,而其中的50%可能永遠不會使用。 –
@StephenMuecke所以你建議我用自己的視圖創建兩個單獨的控制器,並在需要時將其作爲局部視圖加載到我的MainController中? –