我可以提交包含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中获取所有选定的条目
答案 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);
}
示例输出
并在动作方法中收到数据
答案 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();
}