2016-12-15 11 views
0

У меня есть viewmodel, который я назвал ResultsViewModel, который я использовал для сильного ввода моего представления create в asp.net core mvc 1.1. Он имеет 5 выпадающие и несколько полей ввода, как показано в моем коде ниже:Asp.Net Core 1.1 ViewModel Null после формы Post

Это 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; } 
} 

Это создать вид. Его стандарт с ничем особенным

@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, и все имеет значение null, особенно выпадающие списки. Так что все идет к югу оттуда. Может кто-нибудь, пожалуйста, дайте мне знать, что происходит? Потому что я нахожу это раздражающим. Надеюсь, это не ошибка в каркасе, потому что я понял, что это была ошибка в ранних версиях фреймворка. В любом случае любая помощь будет оценена.

+0

Вы пробовали использовать бритва BeginForm? '@using (Html.BeginForm()) {' – Tyriddik

+0

@Tyriddik, я попробую это и посмотрю, что произойдет. –

ответ

1

Ваши создания dropdownlists, которые не имеют отношения ни к одному из свойств вашей модели.

Первый привязывается к свойству с именем Student, которого не существует. Второй привязывается к свойству с именем Subject, который снова не существует. Третий привязывается к свойству Session, который представляет собой набор сложных объектов (IEnumerable<SelectListItem>), но элемент <select> возвращает только одно значение - значение выбранного параметра. То же самое для 4-го.

Ваша модель должна свойствами связываться с

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

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

, а затем с точки зрения его

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

Заметь его неясно, почему вы используете new { @id = "studentselect" } переопределить id атрибут по умолчанию, генерируемый методом (что составляет id="SelectedStudent")

Alter изначально, с помощью Tag Helper

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

В 3 входе, сгенерированный с помощью свяжет штраф при условии вашего представления действительного значения для этих типов свойств.

Side Примечание: В методе 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 Core сделали некоторые из этих вещей ясными. Я установил идентификатор, потому что я не знал, что идентификаторы установлены по умолчанию.Но хороший человек. Большое спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^