将对象数组作为隐藏字段值传递到MVC控制器

8

我正在使用VS2015和MVC5。

我的提交表单:

        @using (Html.BeginForm("Test", "Home", FormMethod.Post))
    {
        <input name="celo" type="hidden" value="994" />
        <input name="pispis" type="hidden" value="Došel je prošel pisani Vuzem!" />
        <input name="userji" type="hidden" 
            value="[{'ID':1,'Name':'John','TotalPayed':0,'TotalDebt':0},
                {'ID':2,'Name':'George','TotalPayed':0,'TotalDebt':0},
                {'ID':3,'Name':'Simon','TotalPayed':0,'TotalDebt':0},
                {'ID':4,'Name':'Antonio','TotalPayed':0,'TotalDebt':0}]" />
        <input type="submit" value="Submit test"/>
    }

控制器:

    public void Test(int celo, string pispis, List<User> userji)
    {

    }

用户类:

    public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int TotalPayed { get; set; }
    public int TotalDebt { get; set; }         
}

传输值“celo”和“pispis”是正确的。我在处理对象数组“userji”时遇到了问题 - 在控制器上它是空的。是否有一种方法可以使用提交表单将对象数组传递到控制器中?


你不能这样做。你需要为集合中的每个项目创建一个输入(使用for循环或自定义EditorTemplate来处理User类型)。但是,将大量数据发送到客户端,然后再无改变地全部发送回来的意义何在呢?如果需要,只需在POST方法中重新获取数据即可。 - user3559349
客户端动态创建了对象数组。我想将该数组传递到服务器。 - FrenkyB
它是如何生成的?为了向该方法发送POST请求,您需要使用“<input name = [0] .ID ... />”,“<input name = [1] .ID ... />”等。 - user3559349
@StephenMuecke - 这样我就可以保存一个对象,创建四个隐藏字段,就像你描述的那样。我如何保存对象数组? - FrenkyB
是的,每个集合项的每个属性都需要一个输入。但是如果您认为需要这样做,我怀疑您的设计存在问题。 - user3559349
显示剩余2条评论
3个回答

7
@using (Html.BeginForm("Test", "Home", FormMethod.Post))
{
    var users = new List<User> 
    {
        new User { Name = "John", TotalPayed = 0, TotalDebt = 0 },
        new User { Name = "George", TotalPayed = 0, TotalDebt = 0 },
        new User { Name = "Simon", TotalPayed = 0, TotalDebt = 0 },
        new User { Name = "Antonio", TotalPayed = 0, TotalDebt = 0 }
    };

    <input name="celo" type="hidden" value="994" />
    <input name="pispis" type="hidden" value="Došel je prošel pisani Vuzem!" />

    @for(int i = 0; i < users.Count; i++)
    {
        var user = users[i];

        <input name="userji[@i].Name" type="hidden" value="@user.Name" />
        <input name="userji[@i].TotalPayed" type="hidden" value="@user.TotalPlayed" />
        <input name="userji[@i].TotalDebt" type="hidden" value="@user.TotalDebt" />
    }

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

4

@FrenkyB 您可以将绑定更改为字符串,然后像这样将其转换为列表。

public void Test(int celo, string pispis, string userji)
{
    var myList = JsonConvert.DeserializeObject<List<User>>(userji);

    //stuff
}

或者正如其他人所评论的那样,您可以使用循环等方法为每个输入创建输入。这是一种快速将当前的JSON输入转换为列表的方法。 - Mike Wallace

1

我知道的实现你所要求的唯一方法有点作弊。我过去使用的方法是将其作为字符串传递,然后在控制器端将数据解析为JSON格式。


它可以工作...字符串传递到控制器。如果该字符串以某种方式转移到List<User>中,那将是理想的...否则,这是一个好点。我的意思是,它已经作为List<User>传递到控制器。 - FrenkyB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接