2016-02-19 55 views
0

情景:
首先,对不起我的英语。 我试图做的是发布形式低谷-POST下列对象:用剃刀在MVC中发布复杂对象列表

public class AppConfigViewModelInput 
{ 
    public string Setting { get; set; } 
    public string Value { get; set; } 
} 

以下方法:

[HttpPost] 
    public ActionResult Index(List<AppConfigViewModelInput> listOfAppConfigToUpdate) 
    { ... } 

但这输入对象仅由两个属性构成视图对象,我用它来显示我的剃须刀页上的数据:

public class AppConfigViewModel : AppConfigViewModelInput 
{ 
    public string Description { get; set; } 
    public string ConfigType { get; set; } 
    public int ViewOrderInWebAdmin { get; set; } 
    public string ViewSpecialBackgroundColor { get; set; } 
} 

我读了很多问题和博客(检查出的问题,以便参考)。最后我能得到我的剃须刀页面下面的代码(我只发布表单代码段):

@model List<PGWebAdmin.Models.AppConfigViewModel> 
@{ 
    var itemCnt = 0; 
} 
@foreach (var item in Model) 
    { 
     itemCnt++; 
     <input type="hidden" name="AppConfigViewModelInput.Index" value="@itemCnt" /> 
     <input type="text" class="input-sm form-control" value="@item.Value" name="AppConfigViewModelInput[@itemCnt].Value"/> 
     <input type="text" name="AppConfigViewModelInput[@itemCnt].Setting" value="@item.Setting"/> 
    } 

,并通过创建表单:

@using (Html.BeginForm("Index", "AppConfig", 
    FormMethod.Post, new { @class = "navbar-form navbar-right", role = "search" })) 
    { 

问题:
我可以发送数据,我正在用开发工具检查以下信息:enter image description here

即发布到该方法,并且该方法被击中,但该参数的值为空:

enter image description here

我测试和修正,尝试了几种方法可以做到这一点,但这是很远,我可以拿到了,我不明白发生了什么。

我做错了什么?为什么我仍然无效?

任何帮助将被优先。 谢谢!

参考:
MVC post a list of complex objects
How can I post a list of items in MVC
Posting to a list<modeltype> MVC3

+0

生成你视图中正确使用'for'环或'EditorTemplate'按照[此答案](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943) –

回答

4

您需要更改参数的名称以匹配您在“名称”字段中发送的内容。

即更改后的控制器:

[HttpPost] 
public ActionResult Index(List<AppConfigViewModelInput> AppConfigViewModelInput) 
    { ... } 
+0

这也是。我的帖子在下面的作品,但这是重要的要记住。您将输入名称作为对象名称发布。您需要将输入名称作为您告诉活页夹预期的名称。 (不是型号) –

+0

这个解决了!非常感谢!!! –

1

我没有看到你发送的AppConfigModelInput.Index的原因,我认为这可能是你的问题。您发送的消息不应包含不属于型号的数据

1

试试这个吗?这可能不是最好的答案,但它应该适用于你的目的。

[HttpPost] 
    public ActionResult Index(AppConfigViewModelInput[] listOfAppConfigToUpdate) 
    { ... } 

而像这样的HTML ..

@model List<PGWebAdmin.Models.AppConfigViewModel> 
@{ 
    var itemCnt = 0; 
} 
@foreach (var item in Model) 
    { 
     itemCnt++; 
     <input type="text" class="input-sm form-control" value="@item.Value" name="listOfAppConfigToUpdate[@itemCnt].Value"/> 
     <input type="text" name="listOfAppConfigToUpdate[@itemCnt].Setting" value="@item.Setting"/> 
    } 

我删除指数的顶部输入..我看不出它的用武之地。您可以将数组转换成内部列表中指数法。

1

输入文件名是错误的!由于您的HttpPost操作期望收集AppConfigViewModel。你并不需要AppConfigViewModelInput。输入字段名称的前缀。对于模型绑定工作,你输入的字段名称应该像

<input type="hidden" name="[0].Index" value="" /> 
<input type="hidden" name="[1].Index" value=" /> 

另外,还要确保你的表单元素是一个表单标签。

以下应该工作。

@model List<PGWebAdmin.Models.AppConfigViewModel> 
@{ 
    var itemCnt = 0; 
} 
@using (Html.BeginForm()) 
{ 
    foreach (var item in Model) 
    { 

    <input type="hidden" name="[@itemCnt].Index" value="@itemCnt" /> 
    <input type="text" value="@item.Value" name="AppConfigViewModelInput[@itemCnt].Value"/> 
    <input type="text" name="[@itemCnt].Setting" value="@item.Setting"/> 
    itemCnt++; 
    } 
    <input type="submit" value="Save" class="btn btn-default" /> 
}