2016-12-15 11 views
0

私は、私が強くasp.netコアmvc​​ 1.1で私の作成ビューを入力するために使用されるResultsViewModelと呼ばれるviewmodelを持っています。これは、ビューモデル。これは、ビューを作成することですAsp.Netコア1.1 ViewModelフォームポストの後のヌル

public class ResultsViewModel 
{ 
    public ResultsViewModel() 
    { 
    } 
    [Display(Name = "Students")] 
    public SelectList Students { get; set; } 
    [Display(Name = "Subjects")] 
    public SelectList Subjects { get; set; } 
    [Display(Name = "Term")] 
    public Term Terms { get; set; } 
    [Display(Name = "Continuous Assessment")] 
    public SelectList ContinuousAssessments { get; set; } 
    [Display(Name = "Continuous Assessment Score")] 
    [DisplayFormat(DataFormatString ="{0:F2}")] 
    public double CAScore { get; set; } 
    [Display(Name = "School Year")] 
    public SelectList Session { get; set; } 
    [Display(Name = "Class")] 
    public SelectList Class { get; set; } 
    [Display(Name = "Average Score")] 
    [DisplayFormat(DataFormatString = "{0:F2}")] 
    public double AverageScore { get; set; } 
    [Display(Name = "Term Total Score")] 
    [DisplayFormat(DataFormatString = "{0:F2}")] 
    public double TermTotal { get; set; } 
} 

ある

:それは5つのドロップダウンし、以下の私のコードに示すように、いくつかの入力フィールドがあります。特別なものはなくその標準

@model SwiftSchool.ViewModels.ResultsViewModel 
@{ 
    ViewData["Title"] = "Create"; 
} 
<h2>Create</h2> 
<form asp-action="Create" method="post"> 
    <div class="form-horizontal"> 
     <h4>Result</h4> 
     <hr /> 
     <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
     <div class="form-group"> 
      <label asp-for="Students" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       @Html.DropDownList("Student", Model.Students, "Select Student", new { @class = "form-control", @id = "studentselect" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Subjects" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       @Html.DropDownList("Subject", Model.Subjects, "Select Subject", new { @class = "form-control", @id = "subjectselect" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Session" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       @Html.DropDownList("Session", Model.Session, "Select School Session", 
       new { @class = "form-control", @id = "sessionselect" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Class" class="col-md-2 control-label"></label> 
      <div class="col-md-4"> 
       @Html.DropDownList("Class", Model.Class, "Select Student Class", 
       new { @class = "form-control", @id = "classselect" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="ContinuousAssessments" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       @Html.DropDownList("C.A", Model.ContinuousAssessments, "Select C.A", 
       new { @class = "form-control", @id = "caselect" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="CAScore" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="CAScore" class="form-control" readonly id="cascore" /> 
       <span asp-validation-for="CAScore" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="AverageScore" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AverageScore" class="form-control" /> 
       <span asp-validation-for="AverageScore" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="TermTotal" class="col-md-2 control-label"</label> 
      <div class="col-md-10"> 
       <input asp-for="TermTotal" class="form-control" /> 
       <span asp-validation-for="TermTotal" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default"/> 
      </div> 
     </div> 
    </div> 
</form> 
<div> 
    <a asp-action="Index">Back to List</a> 
</div> 
@section Scripts { 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} 
} 

私はResultsViewModelを送信してコントローラに返すフォームを持っています。私のビューのドロップダウンとPOSTを処理するメソッドを作成する二つの方法を以下に示します。

// GET: Result/Create 
public IActionResult Create() 
{ 
    var rim = new ResultsViewModel(); 
    rim.Students = new SelectList(_context.Students.ToList(), "Id", "FullName"); 
    rim.Subjects = new SelectList(_context.Subjects.ToList(), "Id", "Name"); 
    rim.ContinuousAssessments = new SelectList(_context.ContinuousAssessment.ToList(), "Id", "Name"); 
    rim.Class = new SelectList(_context.Classes.ToList(), "Id", "ClassName"); 
    rim.Session = new SelectList(_context.Sessions.ToList(), "Id", "SessionName"); 
    return View(rim); 
} 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Create(ResultsViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     _context.Add(model); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

     return View(model); 
    } 
} 

をだから私は、私が設定され、フォーム上のすべてのフィールドを選択し、充填した後、フォームのPOSTを行うときModelStateが有効かどうかをチェックし、Createメソッドに注入されたviewmodelを検査し、すべてがヌル、特にドロップダウンであるかどうかを確認するブレークポイントです。だから、すべてがそこから南に行くだけです。誰かが私に何が起こっているのか教えてもらえますか?私はこの迷惑な見つける。私はフレームワークの別のバグではないことを願っています。これは、以前のバージョンのフレームワークのバグであることがわかりました。とにかく助けていただければ幸いです。

+0

あなたが使用しようとしましたかみそりBeginForm? '@using(Html.BeginForm()){' – Tyriddik

+0

@Tyriddik私はそれを試して何が起こるかを見ます。 –

答えて

1

作成したドロップダウンリストは、モデルのいずれのプロパティとも関係がありません。

最初のものは、存在しないStudentという名前のプロパティにバインドされます。 2番目のプロパティは、Subjectという名前のプロパティにバインドされています。 3番目の要素は複合オブジェクト(IEnumerable<SelectListItem>)のコレクションであるプロパティSessionにバインドされますが、<select>要素は単一の値(選択されたオプションの値)をポストバックします。同上は4日目。

あなたのモデルは

[Display(Name = "Students")] 
[Required("Please select a student")] 
public int SelectedStudent { get; set; } 

public IEnumerable<SelectListItem> Students { get; set; } 

にバインドするプロパティを必要とし、あなたのデフォルトを上書きするnew { @id = "studentselect" }を使用して、なぜ、ビューにその

@Html.DropwDownListFor(m => m.SelectedStudent, Model.Students, "Select Student", new { @class = "form-control" }) 

が不明確に注意してくださいid方法によって生成された属性(id="SelectedStudent"

アルターネイティブに、タグヘルパー

<select asp-for="SelectedStudent" asp-items="Model.Students" class="form-control"> 
    <option>Select Student</option> 
</select> 

あなたがそれらのプロパティタイプに有効な値を提出すると仮定すると罰金バインドします使用して生成された3つの入力を使用して。

サイドノート:POSTメソッドでは、あなたがビューにモデルを返す前にSelectListsを再移植する必要がある、またはそれらはnullになり、例外がスローされます - 参照してくださいThe ViewData item that has the key 'XXX' is of type 'System.Int32' but must be of type 'IEnumerable'

+0

ありがとうございます@Stephen、私はASPNETコアのドキュメントがこれらの事のいくつかを明確にしたいと思います。私はIDがデフォルトで設定されているのか分からなかったので、IDの設定をしました。しかし、良い人。どうもありがとう –

関連する問題