2016-05-24 77 views
0

在我的控制器中,我有一個包含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); 
     } 

我把一個斷點在該行的方法被調用,以及「藥品」爲空。我可以知道我哪裏錯了嗎? :(

+1

這是可能的,但它不是一個好主意,使用一個行動的藥物和食物。在維護方面,還應該分別實施幾件事。 –

+1

爲什麼不用''Details(int id)''''Edit(int id)''方法''FoodController'和'DrugController'是一樣的?通過使用Ajax爲您的集合加載partials視圖,而不是將所有數據發送到視圖時,您可以大大提高性能,而其中的50%可能永遠不會使用。 –

+0

@StephenMuecke所以你建議我用自己的視圖創建兩個單獨的控制器,並在需要時將其作爲局部視圖加載到我的MainController中? –

回答

2

你可以多一個參數傳遞到您的ActionResultDrugFood區分。舉個例子,我會加入type參數;這裏的價值drugfood爲相應的行動。

藥品


@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, type="drug" }) | @Html.ActionLink("Details", "Details", new { id = item.DrugId, type="drug" }) | @Html.ActionLink("Delete", "Delete", new { id = item.DrugId, type="drug" }) 
    </td> 
</tr> 
} 

食品


@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, type="food" }) | @Html.ActionLink("Details", "Details", new { id = item.FoodId, type="food" }) | @Html.ActionLink("Delete", "Delete", new { id = item.FoodId, type="food" }) 
    </td> 
</tr> 
} 

ActionResult Details現在應該接受兩個參數,idtype

// GET: Admin/Details/5 
public ActionResult Details(int? id, string type) { 
    //You do not want to do anything if you don't have type value too, so the condition 
    if (id == null || string.IsNullOrEmpty(type)) { 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    if(type=="drug"){ 
     Drug drug = db.Drugs.Find(id); 
     if (drug == null) { 
     return HttpNotFound(); 
     } 
     return View(drug); 
    } 
    else 
    { 
     Food food = db.Foods.Find(id); 
     if (food == null) { 
     return HttpNotFound(); 
     } 
     return View(food); 
    } 
} 

希望您能與不同models可以通過有效地處理您的視圖


編輯

您也可以檢查一下以下的方法,通過增加三元操作,但我不知道它是否會工作或沒有。你可以試試看。

// GET: Admin/Details/5 
public ActionResult Details(int? id, string type) { 
    //You do not want to do anything if you don't have type value too, so the condition 
    if (id == null || string.IsNullOrEmpty(type)) { 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    var model=type=="drug"?db.Drugs.Find(id):db.Foods.Find('id'); 
    if (model == null) { 
     return HttpNotFound(); 
    } 
    return View(model); 
} 
+0

嗨,謝謝你的幫助!它按預期爲細節工作。不過,我目前遇到了Create的一些問題。你介意幫我看看這個問題嗎?我已經更新了它。 –

+0

需要更多的細節,我可以幫你更好的,如果你想與大家分享的任何社交媒體地址..如Gmail .. –

+2

你一定要明白這一切都不將工作,除非你有獨立的創建和編輯方法食品藥品 –

1

我可以建議你兩種方法來做到這一點。

  1. 對於這兩種藥品和食品創建6個不同的操作,如

Food_Edit,Food_Details,Food_Delete,Drug_Edit,Drug_Details, Drug_Delete

  • 傳遞指示類型的動作的另一個參數。在這種情況下,您可能需要使用另一種路由方法。
  • @ Html.ActionLink( 「編輯」, 「編輯」,新的{ID = item.FoodId,類型= 「食品」 })

    @ Html.ActionLink( 「編輯」, 「編輯」,新的{id = item.DrugId,type =「Drug」 })

    相關問題