好的,經過一番研究,我無法理解「viewmodel事物」。如何使用ViewModel
我沒有找到任何文章解釋我使用ViewModels的步驟,與將實體作爲模型簡單傳遞給View相比。 當使用純實體時,它非常直接:
如果創建一個新條目,只顯示視圖。如果是發佈,驗證,請添加(x)和voilá!編輯時,填充對象並將其發送到視圖。發佈,驗證,更改狀態並保存。這裏沒有祕密。
但我無法創建和編輯ViewModels。有人可以幫助我嗎?
短,我有這樣的波蘇斯:
public class Vessel
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public int ShipownerId { get; set; }
public virtual Shipowner Shipowner { get; set; }
}
public class Shipowner
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Vessel> Vessels { get; set; }
}
這種觀點:
@model INTREPWEB.Models.VesselCreateViewModel
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Vessel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Vessel.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Vessel.Name)
@Html.ValidationMessageFor(model => model.Vessel.Name)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Vessel.ShipownerId, Model.Shipowners, String.Empty)
@Html.ValidationMessageFor(model => model.Vessel.Name)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
我創建這個視圖模型:
public class VesselCreateViewModel
{
public Vessel Vessel { get; set; }
public SelectList Shipowners { get; set; }
public VesselCreateViewModel()
{
using (INTREPDB db = new INTREPDB())
{
var list = db.Shipowners.ToList()
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.Id.ToString()
});
Shipowners = new SelectList(list, "Value", "Text");
}
}
public VesselCreateViewModel(int id)
{
using (INTREPDB db = new INTREPDB())
{
Vessel = db.Vessels.Find(id);
var list = db.Shipowners.ToList()
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.Id.ToString()
});
Shipowners = new SelectList(list, "Value", "Text");
}
}
}
正如你所看到的,它會自動填充View的集合以顯示DropDown菜單。通過與我僅使用模型相同的方式,我能夠創建新的血管。但編輯這個東西時弄不清楚我做錯了什麼。
這是錯誤的POST Edit方法:
[HttpPost]
public ActionResult Edit(VesselCreateViewModel vm)
{
if (ModelState.IsValid)
{
db.Entry(vm.Vessel).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(vm);
}
我應該怎麼做,以挽救這個小怪物?
我認爲視圖模型在mvc中有不同的背景 – Tassadaque
是的,我相信你是對的我對mvc瞭解不多,而我只是剛開始使用MVVM。而我現在只看到它是asp.net-mvc的問題。 :)但是,那麼他不應該使用控制器? – BigL
他的actionresult方法是在控制器中 – Tassadaque