2016-07-04 5 views
1

Ressursリストを含むEmailFormModelを、コントローラで処理したいコントローラに送信したいとします。しかし、自分のコントローラのEmailFormModelの値にアクセスすることはできません。私はセッションを使ってこの問題を克服しようとしましたが、まだそれは動作しません。 リストRessursにはいくつかのRessursbehovが含まれていますが、EmailFormModelは複数ありません。コントローラに送信したときに値が失われる

私のコントローラ

namespace WebApplication6.Controllers 
{ 
    public class AppController : Controller 
    { 
     const string SESSION_SAVED_MODEL = "savedModel"; 
     [HttpGet] 
     public ActionResult Index() 
     { 
      Session[SESSION_SAVED_MODEL] = new EmailFormModel();     
      return View(Session[SESSION_SAVED_MODEL]); 
     } 
     public ActionResult Sent() 
     { 
      return View(); 
     } 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Index(EmailFormModel model) 
     { 
      //other irrelevant code 
      if (Request.Params["Ekstra_Ressurs"] != null) 
      { 
       model.Ressurs.Add(new RessursBehov()); 
       Session[SESSION_SAVED_MODEL] = model; 
      } 
     } 
     return View(model); 
    }  
} 

マイモデル

namespace WebApplication6.Models 
{ 
    public class EmailFormModel 
    { 
     [Required, Display(Name = "Prosjektnummer")] 
     public string Prosjektnummer { get; set; } 
     [Required, Display(Name = "Prosjektnavn")] 
     public string Prosjektnavn { get; set; } 
     [Required, Display(Name = "Prosjekttype")] 
     public string Prosjekttype { get; set; } 
     [Required, Display(Name = "Prosjektleder")] 
     public string Prosjektleder { get; set; } 
     public List<RessursBehov> Ressurs = new List<RessursBehov>() 
     { 
      new RessursBehov() }; 
     } 
     public class RessursBehov 
     { 
      [Required, Display(Name = "Ressurstype")] 
      public string Ressurstype { get; set; } 
      [Required, Display(Name = "Navn på ressurs")] 
      public string Navn_På_Ressurs { get; set; } 
      [Required, Display(Name = "Ukenummer")] 
      public int? Ukenummer { get; set; } 
      [Required, Display(Name = "Antall timer")] 
      public int? Antall_Timer { get; set; } 
      [Required, Display(Name = "Antall uker")] 
      public int? Antall_Uker { get; set; } 
     } 
    } 
} 

マイビューに到達するためには

@model WebApplication6.Models.EmailFormModel 
@{ 
ViewBag.Title = "Registrer nytt prosjekt"; 

List<SelectListItem> prosjektTypeListe = new List<SelectListItem>() 
    { 
     new SelectListItem { Text = "Prosjekt", Value = "Prosjekt" }, 
     new SelectListItem { Text = "Forvaltning", Value = "Forvaltning" } 
    }; 

List<SelectListItem> ressurstypeliste = new List<SelectListItem>() 
    { 
     new SelectListItem { Text = "utvikler", Value = "utvikler" }, 
     new SelectListItem { Text = "frontendutvikler", Value = "frontendutvikler" }, 
     new SelectListItem { Text = "epi-utvikler", Value = "epi-utvikler" }, 
     new SelectListItem { Text = "webnodesutvikler", Value = "webnodesutvikler" }, 
     new SelectListItem { Text = "designer", Value = "designer" }, 
     new SelectListItem { Text = "rådgiver", Value = "rådgiver" }, 
     new SelectListItem { Text = "prosjektleder", Value = "prosjektleder" } 
    }; 
} 
<div class="title"> 
<div class="text-center"> 
    <h2>@ViewBag.Title</h2> 
</div> 
</div> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 


<div class="rows"> 

    <div class="row"> 
     <div class="col-md-4"></div> 
     @Html.LabelFor(m => m.Prosjektnummer, new { @class = "col-md-1 text-center" }) 
     <div class="col-md-7"> 
      @Html.TextBoxFor(m => m.Prosjektnummer, new { @class = "html_label" })    
      @Html.ValidationMessageFor(m => m.Prosjektnummer) 
     </div> 
    </div> 



    <div class="row"> 
     <div class="col-md-4"></div> 
     @Html.LabelFor(m => m.Prosjektnavn, new { @class = "col-md-1 text-center" }) 
     <div class="col-md-7"> 
      @Html.TextBoxFor(m => m.Prosjektnavn, new { @class = "html_label" }) 
      @Html.ValidationMessageFor(m => m.Prosjektnavn) 
     </div> 
    </div> 



    <div class="row"> 

     <div class="col-md-4"></div> 
     @Html.LabelFor(m => m.Prosjekttype, new { @class = "col-md-1 text-center" }) 
     <div class="col-md-7"> 
      @Html.DropDownListFor(m => m.Prosjekttype, prosjektTypeListe, "-- Velg Prosjekttype --", new { @class = "dropdown" }) 
     </div> 

    </div> 

    <div class="row"> 
     <div class="col-md-4"></div> 
     @Html.LabelFor(m => m.Prosjektleder, new { @class = "col-md-1 text-center" }) <!--tar inn m som parameter og returnerer m.prosjektleder--> 
     <div class="col-md-7"> 
      @Html.TextBoxFor(m => m.Prosjektleder, new { @class = "html_label" }) 
      @Html.ValidationMessageFor(m => m.Prosjektleder) 
     </div> 
    </div> 



    @for (var i = 0; i < Model.Ressurs.Count; i++) 
    { 


     <div class="row"> 

      <div class="col-md-4"></div> 
      @Html.LabelFor(m => Model.Ressurs[i].Ressurstype, new { @class = "col-md-1 text-center" }) 
      <div class="col-md-7"> 
       @Html.DropDownListFor(m => Model.Ressurs[i].Ressurstype, ressurstypeliste, "-- Velg ressurstype --", new { @class = "dropdown" }) 
      </div> 

     </div> 

     <div class="row"> 
      <div class="col-md-3"></div> 
      @Html.LabelFor(m => Model.Ressurs[i].Navn_På_Ressurs, new { @class = "col-md-2 text-right" }) 
      <div class="col-md-7"> 
       @Html.TextBoxFor(m => Model.Ressurs[i].Navn_På_Ressurs, new { @class = "html_label" }) 
       @Html.ValidationMessageFor(m => Model.Ressurs[i].Navn_På_Ressurs) 
      </div> 
     </div> 


     <div class="row"> 
      <div class="col-md-4"></div> 
      @Html.LabelFor(m => Model.Ressurs[i].Ukenummer, new { @class = "col-md-1 text-center" }) 
      <div class="col-md-7"> 
       @Html.TextBoxFor(m => Model.Ressurs[i].Ukenummer, new { @class = "html_label" }) 
       @Html.ValidationMessageFor(m => Model.Ressurs[i].Ukenummer) 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-md-4"></div> 
      @Html.LabelFor(m => Model.Ressurs[i].Antall_Timer, new { @class = "col-md-1 text-center" }) 
      <div class="col-md-7"> 
       @Html.TextBoxFor(m => Model.Ressurs[i].Antall_Timer, new { @class = "html_label" }) 
       @Html.ValidationMessageFor(m => Model.Ressurs[i].Antall_Timer) 

      </div> 
     </div> 

     <div class="row"> 
      <div class="col-md-4"></div> 
      @Html.LabelFor(m => Model.Ressurs[i].Antall_Uker, new { @class = "col-md-1 text-center" }) 
      <div class="col-md-7"> 
       @Html.TextBoxFor(m => Model.Ressurs[i].Antall_Uker, new { @class = "html_label" }) 
       @Html.ValidationMessageFor(m => Model.Ressurs[i].Antall_Uker) 
      </div> 
     </div> 
    } 



    <br /> 

    <div class="row"> 
     <div class="col-md-5"></div> 
     <div class="col-md-2"> 
      <input type="submit" class="btn btn-default" value="Legg til ressurser" name="Ekstra_Ressurs" /> 
     </div> 

     <div class="col-md-2"> 
      <input type="submit" class="btn btn-primary" value="Send inn mail" name="Sendknapp" /> 
     </div>       
</div> 
} 

@section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 
} 
+0

削除 '' Html.BeginForm() 'あなたを呼び出すインサイド@ Html.HiddenFor(M => Model.Ressurs [i])と'(その後、すべての不要な 'Session'のものを取り除く) –

+0

'POST'だけでなくコントローラ/アクションも指定する必要があります。 –

+0

@DrewKennedy、それは '[HttpPost]'メソッドに同じ名前で提出されて以来必要ではありません。 –

答えて

1

モデルをHttpPostのインデックスアクション
1)GETインデックスアクションメソッドのViewにEmailFormModelタイプモデルを渡す必要があります。

EmailFormModel model  = new EmailFormModel(); 
Session[SESSION_SAVED_MODEL]=model; 
return View(model); 

2)あなたは変更に

@Html.TextBoxFor(m => Model.Prosjektleder, new { @class = "html_label" }) 

ラムダ式でモデルを持つすべてのMSをモデルを使用する必要があります。

+1

これはこれとは無関係で、式Mの 'Model'を式 –

-1

あなたがしなければならないことは、html属性に@Nameを追加することだけです。セッションを使用する必要もありません。

@Html.DropDownListFor(m => m.Prosjekttype, prosjektTypeListe , "-- Velg Prosjekttype --", new { @class = "dropdown" , @Name = "Prosjekttype" }) 
+0

で使うのは間違いです。' DropDownListFor() 'メソッドはすでに' name = "Prosjekttype" 'を追加しています。 'name'属性は、あなたのアプリが失敗しないようにします。 –

+0

@StephenMueckeこの変更を行った後でコードを実行しましたか?あなたがコードを実行しない限り、コメントをしないでください。 –

+0

@HerStaこれで問題が解決されたことを確認できますか? –

関連する問題