[英]How to do custom Model Binder in C# mvc
我有一個模特:
public class MyModel
{
public MyModel (int ID, string Name)
{
this.ID = ID;
this.Name= Name;
}
public int ID { get; set; }
public string Name{ get; set; }
}
在我的控制器中,我為此模型分配了價值。 這是我要在視圖上顯示的項目列表。
public ActionResult Create()
{
IEnumerable<MyModel> myModel = from q in tbl1.AsEnumerable()
select new MyModel (q.ID, q.Name);
return View(myModel);
}
這是我的看法:
@model IEnumerable<xxx_website.Models.MyModel >
@foreach (var item in Model)
{
@Html.EditorFor(model => item.Name)
}
<input type="submit" value="Submit" />
當我單擊Submit按鈕時,我想將MyModel數據傳遞給控制器。 但是,它始終為空。
我想我需要BindModel
並在protected void Application_Start()
函數中寫一些東西。 但是,我不知道該怎么做。
兩個問題。
MyModel
沒有無參數的構造函數。 沒有一個, DefaultModelBinder
將不起作用,因此添加一個
public class MyModel
{
public MyModel() {} // add parameterless constructor
public MyModel (int ID, string Name)
{
this.ID = ID;
this.Name= Name;
}
}
在您的視圖中,您正在創建具有相同名稱(和無效html的ID)的輸入。 為MyModel
創建自定義EditorTemplate並使用@Html.EditorFor(m => m)
(不在foreach循環中)或將集合更改為IList
並使用for
循環,以便使用索引器正確命名輸入
for (int i = 0; i < Model.Count; i++)
{
@Html.TextBoxFor(m => m[0].Name)
}
在這兩種情況下,您的html都會
<input type="text" name="[0].Name" ...>
<input type="text" name="[1].Name" ...>
...
可以正確綁定到
[HttpPost]
public ActionResult Create(IEnumerable<MyModel> myCollection)
{
我想做以前想要的方式,但是現在我總是在View中使用Object Modal,而不使用Collection我的方式是:我有自定義Modal
public class MyModel
{
public IEnumerable<Item> MyItems;
}
public class Item
{
public int ID { get; set; }
public string Name{ get; set; }
}
然后在控制器中將集合添加到MyModel
public ActionResult Create()
{
MyModel myModel = new MyModel();
myModel.MyItems = from q in tbl1.AsEnumerable()
select new MyModel (q.ID, q.Name);
return View(myModel);
}
注意:鑒於您必須將模態提交表單
@model xxx_website.Models.MyModel
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Create", "Home", FormMethod.Post))
{
for (int i = 0; i< Model.MyItems.Count; i++)
{
@Html.EditorFor(model => model.MyItems[i].Name)
}
<input type="submit" value="Submit" />
}
最后是在控制器中,您可以執行后期操作
[HttpPost]
public ActionResult Create(MyModel modal)
{
IEnumerable<Item> myItems = modal.MyItems; // your item here
return View();
}
這是我的方式。 您可以在這里嘗試並發表評論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.