在MVC中发布多个对象列表

时间:2014-04-22 05:51:55

标签: c# asp.net-mvc

我可以提交包含2组对象的表单,我的模型看起来像这样吗

        public class Item 
    {

    public int Id{get;set;}
            public bool Selected{get;set;}
    public string Name {get;set;}
    public string Price {get;set;}

    }

    public class Translations
    {

    public int Id{get;set;}
            public bool Selected{get;set;}
    public int ItemId{get;set;}
    public string Name {get;set;}
    public string TransName {get;set;}

    }

    public class ModelToSubmit
    {
    public List<Item> Items{get;set;}
    public List<Translations> TransItems{get;set;}
    }

如何向控制器提交ModelToSubmit?任何的想法? {想要从ModelToSubmit的Items和TransItems中获取所有选定的条目

4 个答案:

答案 0 :(得分:1)

MVC使用html元素的name属性将视图html控件绑定到提交给控制器的模型,如果是列表, name 属性将采用以下格式:

<input type='text' name='Items[0].Id'/>
<input type='text' name='Items[0].Name'/>
<input type='text' name='Items[0].Price'/>
.
.
.
<input type='text' name='Items[n].Id'/>
<input type='text' name='Items[n].Name'/>
<input type='text' name='Items[n].Price'/>

和transItems

<input type='text' name='TransItems[0].Id'/>
<input type='text' name='TransItems[0].Name'/>
<input type='text' name='TransItems[0].Price'/>
.
.
.
<input type='text' name='TransItems[m].Id'/>
<input type='text' name='TransItems[m].Name'/>
<input type='text' name='TransItems[m].Price'/>

因此您需要确保与Items和TransItems相关的html控件具有name属性的格式。

希望有所帮助。

答案 1 :(得分:1)

最简单的方法是使用EditorTemplates。他们会为您完成所有艰苦的工作。

https://stackoverflow.com/a/8513087/61164

@model MVC3Stack.Models.ModelToSubmit

@using (Html.BeginForm("Index"))
{
    <table>
    Html.EditorFor(Model.Items);
    </table>
    <table>
    Html.EditorFor(Model.TransItems);
    </table>
    <input type="submit"/>
}

在名为EditorTemplates的Controllers View文件夹(或共享视图)中创建一个文件夹,并在该文件夹中创建一个以项目类型命名的剃刀文件。

Item.cshtml

@model Item

<tr>
    <td>@DisplayFor(x => x.Id)</td>
    <td>@EditorFor(x => x.Name)</td>
    <td>@EditorFor(x => x.Price)</td>
    <td>@CheckBoxFor(x => x.Selected)</td>
</tr>

Translations.cshtml

@model Translations

<tr>
    <td>@Html.DisplayFor(x => x.Id)</td>
    <td>@Html.EditorFor(x => x.ItemId)</td>
    <td>@Html.EditorFor(x => x.Name)</td>
    <td>@Html.EditorFor(x => x.TransName)</td>
    <td>@CheckBoxFor(x => x.Selected)</td>
</tr>

提交行动

[HttpPost]
public ActionResult Index(ModelToSubmit submitModel)
{
   return View(submitModel);
}

答案 2 :(得分:0)

这是您的主要观点

@model MVC3Stack.Models.ModelToSubmit
@{
    ViewBag.Title = "Create";
}
@using (Html.BeginForm("Index1","Home", FormMethod.Post))
{
    Html.RenderPartial("ItemsPartial", Model.Items);
    Html.RenderPartial("TranslationPartial", Model.TransItems);
    <input type="submit" value="Post" />
}

项目部分视图

@{
    Layout = null;
}
<table>
    @for (int i = 0; i < 5; i++)
    {
        <tr>
            <td>
                <span>Name:</span>@Html.TextBox("Items[" + i + "].Name")
            </td>
            <td>
                <span>Price</span>@Html.TextBox("Items[" + i + "].Price")
            </td>
            <td>
                <span>Selected</span>@Html.CheckBox("Items[" + i + "].Selected")
            </td>
        </tr>
    }
</table>

翻译部分视图

@{
    Layout = null;
}
<table>
    @for (int i = 0; i < 5; i++)
    {
        <tr>
            <td>
                <span>Name</span> @Html.TextBox("TransItems[" + i + "].Name")
            </td>
            <td>
                <span>Trans Name</span> @Html.TextBox("TransItems[" + i + "].TransName")
            </td>
            <td>
                <span>Selected</span>@Html.CheckBox("TransItems[" + i + "].Selected")
            </td>
        </tr>
    }
</table>

发布行动

[HttpPost]
public ActionResult Index1(ModelToSubmit submitModel)
{
   return Json("Index Success", JsonRequestBehavior.AllowGet);
}

示例输出

Sample output

并在动作方法中收到数据 enter image description here

答案 3 :(得分:0)

我希望你知道MVC ModelBinding和Stringly Typed Views,如果没有那么先熟悉那些。

MVC Modelbinding使用html标记的name属性将其与相应的Entity属性匹配。

稍微修改您的实体以便更好地理解

<强> ENTITY

public class ModelToSubmit
   {
    public string TestProp{get; set;}
    public List<Item> Items{get;set;}
    public List<Translations> TransItems{get;set;}
   }

查看

@model MVC3Stack.Models.ModelToSubmit

@using (Html.BeginForm("PostToActionName","PostToControllerName"))
{
    @Html.TextBoxFor(model => model.TestProp)
    @Html.TextBox("Items[0].ItemPropName")
    @Html.TextBox("TransItems[0].TranslationsPropName")
    <input type="submit" value="Post" />
}

<强> ACTION

[HttpPost]
public ActionResult PostToActionName(ModelToSubmit collection)
{
   return View();
}