1

我想在我的脑海中做一个非常简单的,但当我尝试创建时真的很复杂。在 MVC ASP.NET 环境中,我想创建一个模型但多次渲染它。这是工作,但是当我想取回数据时,我什么都没有。模型如下所示:

public class HardwareModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    ...
}

包装器看起来像:

public class WrapperModel
{
    public List<HardwareModel> HardwareList { get; set; }

    public WrapperModel()
    {
        HardwareList = new List<HardwareModel>();
    }
}

控制器:

readonly Hardware _hardware = new Hardware();
    [Authorize]
    public ActionResult Index()
    {
        return View(_hardware.GetHardwareList(int.Parse(Session["idEmployee"].ToString())));
    }

    [HttpPost]
    [Authorize]
    public ActionResult Index(WrapperModel model)
    {
        return View(model);
    }

和观点:

<% using (Html.BeginForm())
   {%>
<% foreach (var hardware in Model.HardwareList)
   {%>    
    <tr>
        <td>
            <div class="editor-label">
                <%: Html.LabelFor(m => hardware.SelectedHardwareType) %>
            </div>
            <div class="editor-field">
                <%: Html.DropDownListFor(m => hardware.SelectedHardwareType, hardware.Hardwaretypes) %>
            </div>
...

所以结果是这样的: 查看结果

渲染正是我想要的,但问题是当我按下保存按钮时,使用了控制器的第二部分,但“WrapperModel 模型”的值是一个空列表。在请求值中,我可以看到所有内容都发送到控制器,但 WrapperModel 中没有任何匹配项。

我不知道该怎么做,因为“HardwareModel”的数量可以是 0 或 99,所以我无法创建 HardwareModel1、HardwareModel2 ......就像我在网上看到的那样。

感谢您对我的帮助,并为这篇长文感到抱歉。

4

2 回答 2

2

使用EditorTemplate,你会很好。

创建一个名为EditorTemplates的文件夹并创建一个名为HardwareModel.cshtml 的视图(编辑器模板)

在此处输入图像描述

现在将以下代码添加到编辑器模板(新视图)。您可以根据需要更新布局。

@model HardwareModel           
<p>
 Name @Html.TextBoxFor(x => x.Name) <br />
 Desc : @Html.TextBoxFor(x => x.Description)
 @Html.HiddenFor(x => x.Id)
</p>

现在在您的主视图中,使用Html.EditorForHTML 帮助器方法调用此编辑器模板。

@model WrapperModel
@using (Html.BeginForm())
{       
  @Html.EditorFor(x=>x.HardwareList)
  <input type="submit" value="Save" />    
}

假设您有 GET 操作将 HardwareModels 列表发送到视图,如下所示

public ActionResult Hardware()
{
    WrapperModel model = new WrapperModel();
    //HardCoded for demo.Can be replaced with entries based on your DB data
    model.HardwareList.Add(new HardwareModel { Id=1, Name = "Printer", 
                                                     Description = "desc" });
    model.HardwareList.Add(new HardwareModel { Id=2, Name = "Scanner",
                                                     Description = " desc2" });
    return View(model);
}

现在您的 HttpPost 操作方法将在表单提交时获取子属性

[HttpPost]
public ActionResult Hardware(WrapperModel model)
{
    //check for  model.HardwareList Property here;
    return View(model);
}

在此处输入图像描述

在这里,您可以下载我为解决您的问题而编写的工作示例。

于 2012-09-12T13:55:12.433 回答
1

这是我读过的关于这个问题的最好的文章。希望对您有所帮助:DotNetSlackers - 了解 ASP.NET MVC 模型绑定

具体来说,您可能对Binding with a list of class types部分感兴趣

于 2012-09-12T13:48:21.393 回答