2017-05-26 18 views
-1

私はこれに関する多くの例を見てきましたが、何の作用も得られません。私は、ビューモデルSomeDataViewModelの後ろを渡すことを証明するか、または反証するためのこのサンプルを作成しました。MVC ViewModelが投稿されていません

私はドロップダウンリストのデータをポストバックしようとしています。すべてがOKに動作しますが、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ヘルパーとの複雑なデータのための隠された入力をレンダリングすることはできません。

単純なタイプでのみ使用してください。あなたは同じ権利のためにあなたのマッピングがフォームPOSTに結合する必要があり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。

+1

ワイヤでデータ全体を大量に送信してから、それをそのまま元に戻すのは無意味です –

+1

@StephenMueckeが合意しました。彼が望むなら、クライアントが手動でそれを変更できるので、それはまた良いことではありません。しかし、私はちょうどOP質問 –

+0

にお答えします。私はそれが難しくないことを知っていた。スティーブンスの記事への回答として、ここで私が提供したのは、私が書いているコードを全く反映していない簡単な例でした。計画は、追加、削除、または変更できるオブジェクトのリストを送信することです。これが要件の理由です。私はAjaxとJsonを使用していましたが、これはグリーンフィールドのアプリケーションではありません。既存のコードフレームワーク内で作業するためのものです。 – gilesrpa

0

確かに型変換エラーがあります。あなたのSelectedOtherDataはint型ですが、selectlistitemの値は文字列の型です

関連する問題