2017-05-26 65 views
-1

我已經看到了很多這方面的例子,但不能得到任何工作。我已經建立了這個例子來證明/反駁視圖模型SomeDataViewModel的傳回。MVC ViewModel不回發

我想回傳下拉列表數據。一切工作正常,但TestViewModel的OtherData屬性永遠不會返回中傳遞的收集

嘗試過加入:

@Html.HiddenFor(m => Model.OtherData) 

,但這又只是產生以下錯誤;

The parameter conversion from type 'System.String' to type 'SomeDataViewModel' failed because no type converter can convert between these types 

驗證碼:

的ViewModels

TestViewmodel

public class TestViewModel 
{ 

    public TestViewModel() 
    { 
     OtherData = new List<SomeDataViewModel>(); 
    } 

    public int Id { get; set; } 
    public String Name { get; set; } 
    public DateTime DoB { get; set; } 
    public int SelectedOtherData { get; set; } 
    public List<SomeDataViewModel> OtherData { get; set; } 

    public IEnumerable<SelectListItem> TolistData() 
    { 

     IEnumerable<SelectListItem> ret = OtherData.Select(i => new SelectListItem() { Text = i.Text, Value=i.Value }); 


     return ret; 
    } 
} 

SomeDataViewmodel

public class SomeDataViewModel 
{ 
    public string Value { get; set; } 
    public string Text { get; set; } 
} 

查看

@model TestViewModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 
@using (Html.BeginForm("Index","Home")) 
{ 
<div class="row"> 
    <div class="col-md-12"> 
     <br /> 
     @Html.EditorFor(m => Model.Id) 
     <br /> 
     @Html.EditorFor(m => Model.Name) 
     <br /> 
     @Html.EditorFor(m => Model.DoB) 
     <br/> 
     @Html.DropDownListFor(m => Model.SelectedOtherData, Model.TolistData(), new { id = "OtherData" }) 

     <p><a class="btn btn-default" href="http://go.microsoft.com/fwlink/?LinkId=301865">Learn more &raquo;</a></p> 
    </div> 
</div> 

<button id="dosomething" formmethod="post">Post</button> 

}

控制器

public ActionResult Index() 
    { 

     var model = new TestViewModel() { 
      Id = 99, 
      Name = "Billy", 
      DoB = DateTime.Now 
     }; 

     model.OtherData.Add(
      new SomeDataViewModel { Text = "Bob", Value = "1" }); 
     model.OtherData.Add(
      new SomeDataViewModel { Text = "Sally", Value = "2" }); 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(TestViewModel retModel) 
    { 
     if (ModelState.IsValid) 
     { 
      if (retModel.OtherData.Count() == 0) 
      { 
       var dud = true; 
      } 
     } 
     return View(retModel); 
    } 
+0

[This](https://stackoverflow.com/questions/26155607/mvc-post-a-list-of-complex-objects)可能會給你方向... –

回答

2

不能爲複雜的數據呈現隱藏的輸入與@Html.HiddenFor幫手。

你應該只使用簡單的類型。 Becouse你有數組,你應該寫這樣的事情:

@for(int i = 0; i < Model.OtherData.Count(); i++) 
{ 
    @Html.HiddenFor(m => Model.OtherData[i].Text) 
    @Html.HiddenFor(m => Model.OtherData[i].Value) 
    //... other fields. 
    @Html.HiddenFor(m => Model.OtherData[i].OtherProperty) 
} 

使用for循環,而不是foreach becouse你應該同你的映射正確的形式POST結合。

+1

有點沒有意義通過電線發送大量的數據,然後再次發送不變 –

+1

@StephenMuecke同意。這也不好,因爲客戶可以手動更改它,如果他想。但我只是回答OP問題 –

+0

謝謝大家的幫助。我知道這並不難。回答斯蒂芬的帖子,我在這裏提供的只是一個簡單的例子,沒有反映我寫的代碼。計劃是發送可添加到,刪除或更改的對象列表。這是要求的原因。我會使用Ajax和Json,但這不是一個綠色的應用程序,我只是想在現有的代碼框架中使用某些東西。 – gilesrpa

0

當然存在類型轉換錯誤。您的SelectedOtherData是int類型,而selectlistitem值是字符串的類型