2012-10-31 30 views
0

控制器:模型綁定不工作爲表達式x => x.InputModel.PropertyName

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" /> 
} 

A你可以看到我使用一個帶有特殊lambda表達式的輸入模型。 (x=>x.CreateFavoriteListInputModel.ListName)。 奇怪的問題是,這在我的家用電腦上工作,但不在我的公司之一上(createFavoriteListInputModel = Null)。 似乎有不同版本的ASP.NET MVC4或類似的東西。

也許有人會知道,因爲ASP.NET MVC支持這種模型綁定。

我的代碼適合你嗎?

如果我將視圖模型和lamba表達式更改爲x=>x.ListName,那麼在兩臺計算機上都可以正常工作。

回答

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

我不明白的是爲什麼參數名稱很重要? 對於原始類型,這很清楚,但對於複雜類型,我不明白。

0

我認爲問題在於你傳遞給頁面的模型與傳遞給控制器​​的模型之間的區別。

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

CreateFavoriteListInputModel傳遞給控制器​​POST操作

+0

當然,它是不同的。爲什麼我應該將一個空屬性值(FavoriteTypeDropdownList)傳遞給我的發佈操作? – Rookian

+0

也許我錯了?我的意思是他們不是同一個例子。我認爲兩者都必須是同一個班級的實例。 'CreateFavoriteListViewModel'和'CreateFavoriteListInputModel'是不一樣的 – codingbiz

+0

你說當你使用'x => x.ListName'時它的工作原理?這是因爲'x'是動作所期待的模型的實例 - 'x'是'CreateFavoriteListInputModel' – codingbiz