模型绑定不适用于表达式x => x.InputModel.PropertyName

时间:2012-10-31 23:19:53

标签: c# asp.net-mvc-4 model-binding modelbinders

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var myViewModel = new CreateFavoriteListViewModel();
        var favoriteTypeDropdownList = new List<SelectListItem>();
        favoriteTypeDropdownList.Add(new SelectListItem { Text = "Text1", Value = "1" });
        favoriteTypeDropdownList.Add(new SelectListItem { Text = "Text2", Value = "2" });

        myViewModel.FavoriteTypeDropdownList = favoriteTypeDropdownList;
        return View(myViewModel);
    }

    [HttpPost]
    public ActionResult Post(CreateFavoriteListInputModel createFavoriteListInputModel)
    {
        return new EmptyResult();
    }
}

型号:

public class CreateFavoriteListViewModel
{
    public CreateFavoriteListInputModel CreateFavoriteListInputModel { get; set; }
    public List<SelectListItem> FavoriteTypeDropdownList { get; set; }
}

public class CreateFavoriteListInputModel
{
    [Required]
    public string ListName { get; set; }
    public int SelectedFavoriteType { get; set; }
}

查看:

@model MvcApplication3.Controllers.CreateFavoriteListViewModel
<h2>title</h2>

@using (Html.BeginForm("Post", "Home", FormMethod.Post))
{
    @Html.LabelFor(x => x.CreateFavoriteListInputModel.ListName)
    @Html.TextBoxFor(x => x.CreateFavoriteListInputModel.ListName)

    @Html.LabelFor(x => x.CreateFavoriteListInputModel.SelectedFavoriteType)
    @Html.DropDownListFor(x => x.CreateFavoriteListInputModel.SelectedFavoriteType, Model.FavoriteTypeDropdownList)
    <input type="submit" value="Save" id="btnCreateList" name="btnCreateList" />
}

如您所见,我使用带有特殊lambda表达式的输入模型。 (x=>x.CreateFavoriteListInputModel.ListName)。 奇怪的问题是,这可以在我的家用电脑上运行,但不适用于我的公司(createFavoriteListInputModel = Null)。 似乎有不同版本的ASP.NET MVC4或类似的东西。

也许有人知道,因为ASP.NET MVC支持这种模型绑定。

我的代码是否适合您?

如果我将视图模型和lamba表达式更改为x=>x.ListName,则一切都可以在两台计算机上运行。

2 个答案:

答案 0 :(得分:0)

我认为问题在于您传递给页面的模型与传递给控制器​​的模型之间的区别。

@model MvcApplication3.Controllers.CreateFavoriteListViewModel  <-- was passed to the page

CreateFavoriteListInputModel已传递给控制器​​发布操作

答案 1 :(得分:0)

我发现了问题。问题出在这里:

[HttpPost]
public ActionResult Post(CreateFavoriteListInputModel createFavoriteListInputModel)
{
    return new EmptyResult(); // DOES WORK
}

在我公司的机器上我有这样的东西:

[HttpPost]
public ActionResult Post(CreateFavoriteListInputModel inputModel)
{
    return new EmptyResult(); // DOES NOT WORK
}

参数名称必须与复杂对象CreateFavoriteListInputModel的名称相同(不区分大小写)。

发布参数:

  • CreateFavoriteListInputModel.ListName = TestList
  • CreateFavoriteListInputModel.SelectedFavoriteType = 1
  • btnCreateList =保存

我不明白为什么参数名称很重要? 对于原始类型,这很清楚,但对于复杂类型,我没有得到它。