传递复杂视图模型来HttpPost方法在MVC 3 [英] Pass Complex ViewModel to HttpPost Method in MVC 3

查看:84
本文介绍了传递复杂视图模型来HttpPost方法在MVC 3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在为我的项目的编辑功能,我似乎无法得到视图模型权,以允许它被传递回从视图控​​制器。观模型的结构是这样:

I am currently working on an Edit function for my project and I cannot seem to get the View Model right to allow it to be passed back into the Controller from the View. The structure of the View Model is as such:

public class CreateUserViewModel : ICreateUserViewModel
{
    #region Properties
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string SelectedUserType { get; set; }
    public List<ICreateUserItemViewModel> UserTypes { get; set; }
    public List<ICreateUserItemViewModel> Products { get; set; }
    public List<ICreateUserItemViewModel> Languages { get; set; }
    #endregion

    #region Constructor
    public CreateUserViewModel()
    {
    }

    public CreateUserViewModel(List<Product> products, List<Language> languages)
    {
        Products = new List<ICreateUserItemViewModel>();
        foreach (var prod in products)
        {
            var prodVM = new CreateUserItemViewModel
            {
                Name = prod.Name,
                IsSelected = false,
                ID = (int)prod.ID
            };
            Products.Add(prodVM);
        }

        Languages = new List<ICreateUserItemViewModel>();
        foreach (var lang in languages)
        {
            var langVM = new CreateUserItemViewModel
            {
                Name = lang.Name,
                IsSelected = false,
                ID = (int)lang.ID
            };
            Languages.Add(langVM);
        }

    }
    #endregion
}

子类视图模型 CreateUserItemViewModel

public class CreateUserItemViewModel : ICreateUserItemViewModel
{
    public string Name { get; set; }
    public int ID { get; set; }
    public bool IsSelected { get; set; }
}

我想这个子类重新在视图中显示为复选框psented $ P $,所以用户可以选择包括与否。

I want this subclass to be represented in the view as a checkbox, so the user can choose to include it or not.

用户控制器:

[HttpPost]
public ActionResult Create(CreateUserViewModel model)
{
    if (ModelState.IsValid)
    {
        User newUser = new User();
        newUser.UserName = model.UserName;
        newUser.Password = model.Password;
        newUser.Email = model.Email;
        newUser.Products = model.Products; //Always NULL

当我把一个破发点上的用户名密码和电子邮件属性填充,但产品和语言都是空的这个应用程序的一部分。我用Fiddler2看什么被传递到控制器,这是输出:

When I put a break point on this part of the application the properties for username password and email are populated but Products and Languages are empty. I used Fiddler2 to watch what was being passed into the controller and this was the output:

UserName=asdasdsdasd&Password=asd&Email=asD%40asd.com&type.IsSelected=Admin
&prod.ID=1&prod.IsSelected=true&prod.IsSelected=false
&prod.ID=2&prod.IsSelected=false
&prod.ID=3&prod.IsSelected=false
&prod.ID=4&prod.IsSelected=false
&lang.ID=1&lang.IsSelected=true&lang.IsSelected=false
&lang.ID=2&lang.IsSelected=true&lang.IsSelected=false
&lang.ID=3&lang.IsSelected=false
&lang.ID=4&lang.IsSelected=false
&lang.ID=5&lang.IsSelected=false
&lang.ID=6&lang.IsSelected=false
&lang.ID=7&lang.IsSelected=false
&lang.ID=8&lang.IsSelected=false
&lang.ID=9&lang.IsSelected=false
&lang.ID=10&lang.IsSelected=false
&lang.ID=11&lang.IsSelected=false
&lang.ID=12&lang.IsSelected=false
&lang.ID=13&lang.IsSelected=false
&lang.ID=14&lang.IsSelected=false
&lang.ID=15&lang.IsSelected=false
&lang.ID=16&lang.IsSelected=false
&lang.ID=17&lang.IsSelected=false
&lang.ID=18&lang.IsSelected=false
&lang.ID=19&lang.IsSelected=false

在code为创建视图的金块是:

A nugget of the code for the Create View is:

<div class="editor-label">
    @Html.Label("User Products:")
</div>
<div class="editor-field">
    @foreach (var prod in Model.Products)
    {
        @Html.Label(prod.Name)
        @Html.HiddenFor(x => prod.ID)
        @Html.CheckBoxFor(x => prod.IsSelected, new { name = prod.Name })
    }
</div>
<div class="editor-label">
    @Html.Label("User Languages:")
</div>
<div class="editor-field">
    @foreach (var lang in Model.Languages)
    {
        @Html.Label(lang.Name)
        @Html.HiddenFor(x => lang.ID)
        @Html.CheckBoxFor(x => lang.IsSelected, new { name = lang.Name })
    }
</div>
<p>
    <input type="submit" value="Create" />
</p>

我一直对这个相当长一段时间,我开始觉得我所试图做的是不可能的。我希望它返回 CreateUserViewModel 与所有用户已选择的值完全填充,但我只是不知道如何实现这一目标。

I have been working on this for quite a while and I am beginning to think what I am trying to do is not possible. I want it to return the CreateUserViewModel fully populated with all the values that the user has selected, but I just do not know how to achieve this.

任何想法?

推荐答案

使用一个for循环,而不是一个foreach。

Use a for loop instead of a foreach.

@for (int i=0; i < Model.Products.Count; i++)
{
    @Html.Label(prod.Name)
    @Html.HiddenFor(model => model.Products[i].ID)
    @Html.CheckBoxFor(model => model.Products[i].IsSelected, new { name = prod.Name })
}

您属性ex pression需要包含模型绑定足够的信息来弄清楚如何在POST值绑定到该模型。

Your property expression needs to contain enough information for the model binder to figure out how to bind the POST values to the model.

您也可以尝试为 ICreateUserItemViewModel 创建编辑模板,然后改变你的标记下面的内容。

You could also try creating an Editor Template for ICreateUserItemViewModel and then changing your markup to the following.

@Html.EditorFor(model => model.Products)

这篇关于传递复杂视图模型来HttpPost方法在MVC 3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆