2017-05-26 30 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值是字符串的类型