模型绑定后,嵌套类型的模型为空。

4

我有一个以下的ViewModel:

public class CheckoutViewModel
{
    public string ProductNumber { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public Input UserInput;

    public class Input
    {
        public string Email { get; set; }
        public string Phone { get; set; }
    }
}

还有这样一种操作:

[HttpPost]
public ActionResult Index(CheckoutViewModel model)
{
    // ...
    return View();
}

我的模型绑定如下:

@model GameUp.WebUI.ViewModels.CheckoutViewModel

@using (Html.BeginForm("Index", "Checkout", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <!-- some HTML -->

    @Html.LabelFor(m => m.UserInput.Email)
    @Html.TextBoxFor(m => m.UserInput.Email)

    @Html.LabelFor(model => model.UserInput.Phone)
    @Html.TextBoxFor(model => model.UserInput.Phone)

    <button>Submit</button>
}

当我提交表单时,UserInput为null。我知道ASP.NET MVC能够绑定嵌套类型,但在此代码中不能。同时,我可以通过以下方式获取电子邮件和电话的值:
var email = Request.Form["UserInput.Email"];
var phone = Request.Form["UserInput.Phone"];

也许我做错了什么!这是一个简单的模型绑定,你可以在网上找到它的相关内容。

你可以展示电子邮件或电话的渲染HTML吗? - Karthik Chintala
将用户输入(UserInput)转换为CheckoutViewModel类中的属性(property)。 - Satpal
1
@SatpalSingh:是的,你说得对。我忘记把它变成属性了。谢谢。 - Kevin.A
1个回答

10

你的 UserInput 中没有设置器(setter),我认为自动设置器(setter)不起作用。无论如何,你只需在你的 UserInput 中放置一个getter/setter就可以使其工作,而无需在控制器方法中进行额外的操作:

public Input UserInput { get; set; }

您的完整模型:

public class CheckoutViewModel
{
    public string ProductNumber { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public Input UserInput { get; set; }

    public class Input
    {
        public string Email { get; set; }
        public string Phone { get; set; }
    }
}

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