2016-12-09 5 views
0

私は、私の脳が友人であり、これは明日の朝に笑うつもりですが、残念ながら私はこの部分に立ち往生し、助けを求めています。viewmodelを通してビューからコントローラに値を渡すことができません

私はViewModelにあります。このビューの

public class HousingDetailsViewModel : AppViewModel 
{ 
    DataContext db = new DataContext(); 

    public List<string> units { get; set; } 
    public List<AvailableHousing> availableHousings { get; set; } 
    public Person person { get; set; } 
    public OccupiedHousing currentHousing { get; set; } 
    public OccupiedHousing newHousing; 

    public HousingDetailsViewModel(int? id) 
    { 
      units = db.AvailableHousings.OrderBy(ah => ah.Unit).Select(h => h.Unit).Distinct().ToList(); 
      availableHousings = db.AvailableHousings.Where(h => h.Available == true).OrderBy(h => h.Bed) 
                        .OrderBy(h => h.Room).ToList(); 
      currentHousing = db.OccupiedHousing.Include(o => o.AvailableHousing) 
               .Include(o => o.Person).Where(o => o.PersonID == id && o.CurrentHousing == true).FirstOrDefault(); 
      person = db.Persons.Find(id); 
      newHousing = new OccupiedHousing(); 
    } 
} 

私のコントローラメソッド:

public ActionResult Details(int? id) 
{ 
    return View(new HousingDetailsViewModel(id)); 
} 

[HttpPost] 
public ActionResult Move(OccupiedHousing newHousing, int? personID) 
{ 
    newHousing.PersonID = personID; 
    newHousing.DateArrived = DateTime.Now; 
    newHousing.CurrentHousing = true; 
    newHousing.AvailableHousingID = housingID; 
    db.OccupiedHousings.Add(newHousing); 
    db.SaveChanges(); 


    return RedirectToAction("Index", new HousingViewModel()); 
} 

をそして、私のフォームは1以外の私のすべてのフィールドのために正常に動作し、それはAvailableHousingIDです。私は隠された価値を設定しようとしました。私は隠しフィールドの値を設定するブレークポイントを置いて、それが変更されるのを見ましたが、コントローラには渡されませんでした。だから私はフォームの提出に変更し、ルート値としてそれをキャッチしようとし、それも動作しませんでした。私は迷っています、誰かが私が間違っているのを見ることができますか?

EDIT:追加ルートの表示

@model AppName.ViewModels.HousingDetailsViewModel 
@{ 
    ViewBag.Title = "Housing Details"; 
} 

@Html.BeginForm("Move", "Housing", new { personID = @Model.person.ID }, FormMethod.Post, new { }) 
<script> 
    function setID(id) { 
     $('#HiddenHousingID').val(id); 
     $('#HiddenSubmit').click(); 
    } 
</script> 
<h2>Housing Details</h2> 

<div class="row"> 
    <div class="col-xs-12 container"> 
     <div class="col-xs-5"> 
      <img src="//placehold.it/150x200/77CCDD/66BBCC" class="img-responsive" /> 
     </div> 
     <div class="col-xs-7"> 
      <h4>@Model.person.ComboName</h4> 
      <h4>@Model.currentHousing.AvailableHousing.Unit - @Model.currentHousing.AvailableHousing.Room - @Model.currentHousing.AvailableHousing.Bed</h4> 
      <h4>@Model.person.DateOfBirth.Value.ToShortDateString()</h4> 
      @Html.HiddenFor(m => m.newHousing.AvailableHousingID, new { id = "HiddenHousingID", name = "newHousing.AvailableHousingID")} 
     </div> 
    </div> 
</div> 
<div class="row"> 
    @foreach (var unit in Model.units) 
    { 
     <div class="col-xs-6"> 
      <div class="panel panel-primary"> 
       <div class="panel-heading"> 
        <span class="panel-title"> 
         @unit 
        </span> 
       </div> 
       <div class="panel-body"> 
        <table id="MoveHousingTable" class="table table table-condensed table-striped"> 
         <thead> 
          <tr> 
           <th> 
            Available Housing 
           </th> 
           <th></th> 
          </tr> 
         </thead> 
         <tbody> 
          @foreach (var housing in Model.availableHousings.Where(h => h.Unit == unit)) 
          { 
           <tr> 
            <td> 
             @housing.Room - 
             @housing.Bed 
            </td> 
            <td> 
             <input type="button" value="Select" name="select" onclick="setID(@housing.ID)" /> 
            </td> 
           </tr> 
          } 
         </tbody> 
        </table> 
       </div> 
      </div> 
     </div> 
    } 
</div> 
<input type="submit" class="hidden" id="HiddenSubmit"> 
} 
+0

はあなたも – Usman

+5

(1)ビューモデルは、データベース・アクセス・コード(2)ビューモデルを含めるべきではありませんビューを共有することができます編集時にデータモデルを含むべきではありません。 (3) 'HousingDetailsViewModel'をビューに渡して、あなたのpostメソッドが' public ActionResult Move(HousingDetailsViewModel model) 'である必要があるようにします。(4)パラメータのないコンストラクタを持っていないように見えるので、' DefaultModelBinder'は例外を一回スローしますあなたはポイント3を固定します –

+0

@Usman、私はビューを表示するように更新しました。 BeginFormの使用方法を示しています。ここでは、MoveメソッドのhousingIDパラメータを使用しません。私は上にそれを取っておくべきだったと思う。 – Kramb

答えて

0

@Html.BeginForm("Move", "Housing", new { personID = @Model.person.ID , housingID= @Model.newHousing.AvailableHousingID}, FormMethod.Post, new { }) 
+0

申し訳ありませんが、MoveIDメソッドからhousingIDパラメータを忘れてしまいました。私が隠しを使用するとき、私はhiddenforとしてパラメータを使用していない、少なくとも私はそれを処理すると考えていた。 – Kramb

+0

その後、スティーブンの見解/アイデアに従うべきです - 彼が示唆していることは正しいです。 。 – FakeisMe

関連する問題