【问题标题】:Model Binding is not working for expression x=>x.InputModel.PropertyName模型绑定不适用于表达式 x=>x.InputModel.PropertyName
【发布时间】:2012-10-21 13:16:55
【问题描述】:

控制器:

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=&gt;x.CreateFavoriteListInputModel.ListName)。 奇怪的问题是,这确实适用于我的家用计算机,但不适用于我的公司之一(createFavoriteListInputModel = Null)。 似乎有不同版本的 ASP.NET MVC4 或类似的东西。

也许你们中的某些人知道,自从这种模型绑定被 ASP.NET MVC 支持以来。

我的代码对你有用吗?

如果我将视图模型和 Lamba 表达式更改为即 x=&gt;x.ListName 一切都在两台计算机上运行。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 当然不一样。为什么我应该将 null 属性值 (FavoriteTypeDropdownList) 传递给我的帖子操作?
    • 也许我错了?我的意思是它们不是同一个实例。我认为两者都必须是同一类的实例。 CreateFavoriteListViewModelCreateFavoriteListInputModel 不一样
    • 您说当您使用x=&gt;x.ListName 时它有效吗?这是因为 x 是动作所期望的模型实例 - xCreateFavoriteListInputModel
    【解决方案2】:

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

    [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=保存

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

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多