簡體   English   中英

Asp:net MVC 3:@ Html.Editor在模板中對我的模型進行子集合?

[英]Asp:net MVC 3: @Html.EditorFor a subcollection of my model in a template?

我已經被困了很長時間來編輯我的模型的子集合,模型的集合變為空。

我終於找到了一個解決方案,但我發現它有點臟:

首先是我的測試數據:

模型對象

    public class ContainerObject
    {
        public String Title { get; set; }
        public List<ContainedObject> ObjectList { get; set; }
    }

子集合對象

public class ContainedObject
{
    public int Id { get; set; }
    public String Text { get; set; }
    public Boolean IsSelected { get; set; }
}

生成對象的控制器方法

    public ActionResult TestForm()
    {
        return View(new ContainerObject()
        {
            Title = "This is a sample title",
            ObjectList = new List<ContainedObject>()
                {
                    new ContainedObject(){Id=1, IsSelected = true, Text="ObjectOne"},
                    new ContainedObject(){Id=2, IsSelected = false, Text="ObjectTwo"},
                    new ContainedObject(){Id=3, IsSelected = true, Text="ObjectThree"},
                    new ContainedObject(){Id=4, IsSelected = false, Text="ObjectFour"},
                }
        });
    }

接收編輯對象的控制器

    [HttpPost]
    public ActionResult TestFormResult(ContainerObject filledObject)
    {
        return View();
    }

風景

@model WebTestApplication.Models.ContainerObject

@{
    ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult","Home", FormMethod.Post)){
    @Html.EditorFor(x => x.Title)
    Html.RenderPartial("ContainedObject", Model.ObjectList);
    <input type="submit"  value="Submit"/>
}

局部視圖(ContainedObject.cshtml)

@model IEnumerable<WebTestApplication.Models.ContainedObject>
@{
    ViewBag.Title = "ContainedObject";
    int i = 0;
}
@foreach (WebTestApplication.Models.ContainedObject currentObject in Model)
{ 
    <br />
    @Html.Label(currentObject.Text);
    @Html.CheckBox("ObjectList[" + i + "].IsSelected", currentObject.IsSelected);                                                                                                     
    @Html.Hidden("ObjectList[" + i + "].Id", currentObject.Id);                                                                                                
    @Html.Hidden("ObjectList[" + i + "].Text", currentObject.Text);
    i++;
}

這實際上是有效的,但我有一個問題:

  • 我自己生成名稱並指定容器對象的屬性

我試圖在視圖中使用Html.EditorFor而不是Html.RenderPartial ,問題是它生成了我的名字“ObjectList。[0] .Id”(在屬性名和訪問者之間有一個額外的。)。

我還嘗試在局部視圖中僅使用@ Html.EditorFor,但它創建了具有對象名稱的變量。

如果我不使用任何模板,它的工作原理:

    @model WebTestApplication.Models.ContainerObject

@{
    ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult", "Home", FormMethod.Post))
{
    @Html.EditorFor(x => x.Title)
    for (int i = 0; i < Model.ObjectList.Count; i++)
    {
        <br />
        @Html.Label(Model.ObjectList[i].Text);
        @Html.CheckBoxFor(m => Model.ObjectList[i].IsSelected);
        @Html.HiddenFor(m => Model.ObjectList[i].Id);
        @Html.HiddenFor(m => Model.ObjectList[i].Text);
    }

    <br /><input type="submit"  value="Submit"/>
}

但這里它是一個簡單的模板,但在我的實際情況中,我會有更多的數據,這將被多次重復使用。 那么我最好的選擇是什么?

您可以通過引入EditorTemplate來簡化代碼。 方法如下:

  • 除了我們用EditorFor替換RenderPartial之外,主視圖幾乎保持不變:

TestForm.cshtml

@model WebTestApplication.Models.ContainerObject

@{
    ViewBag.Title = "TestForm";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm("TestFormResult", "Home", FormMethod.Post)) {
    @Html.EditorFor(m => m.Title)
    @Html.EditorFor(m => m.ObjectList);

    <input type="submit" value="Submit" />
}
  • 然后在Views / Home下創建一個名為EditorTemplates的文件夾(假設您的控制器是Home):

在此輸入圖像描述

  • 並為ContainedObject添加以下模板:

ContainedObject.cshtml

@model WebTestApplication.Models.ContainedObject

<p>
    @Html.DisplayFor(m => m.Text)
    @Html.CheckBoxFor(m => m.IsSelected)
    @Html.HiddenFor(m => m.Id)
    @Html.HiddenFor(m => m.Text)
</p>

編輯器將自動遍歷對象列表,為每個對象呈現視圖。 希望能幫助到你。

我找到了這個線程,同時尋找其他相關的東西。 Denis有正確的答案,但我想我會添加一些語法以防其他人遇到這個:

如果您有一個名為“SomeTemplate.cshtml”的編輯器模板,則可以在視圖中將其用作Item列表,如下所示:

@for (var i = 0; i < Model.ObjectList.Count(); i++)
{
    @Html.EditorFor(m => m.ObjectList[i], "SomeTemplate")
}

然后在您的編輯器模板中:

@model WebTestApplication.Models.ContainedObject

<br />
@Html.Label(Model.Text);
@Html.CheckBoxFor(m => m.IsSelected);
@Html.HiddenFor(m => m.Id);
@Html.HiddenFor(m => m.Text);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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