簡體   English   中英

如何在C#MVC中執行自定義Model Binder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM