使用Razor

时间:2016-02-19 15:12:17

标签: c# .net asp.net-mvc post razor

情景:
首先,抱歉我的英语。 我正在尝试做的是发布表格-POST以下对象:

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; }
}

我正在阅读很多问题和博客(请查看问题中的SO参考资料)。最后,我可以为我的剃刀页面获取以下代码(我只发布了表单代码部分):

@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

发布到方法,并且方法被命中,但参数的值为null:

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

4 个答案:

答案 0 :(得分:4)

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

即更改你的帖子控制器:

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

答案 1 :(得分:1)

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

答案 2 :(得分: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"/>
    }

我删除了索引的顶部输入..我不知道它适合的位置。您可以将数组转换为Index方法中的列表。

答案 3 :(得分: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" />
}