Представление scaffolded create возвращает System.Web.Mvc.WebViewPage <TModel>.Model.get с нулевым значением. до публикации - PullRequest
0 голосов
/ 17 июня 2019

У меня есть представление "создать" в скаффолде, которое, когда я пытаюсь создать новую запись, возвращает ошибку: System.Web.Mvc.WebViewPage<TModel>.Model.get returned null. Еще до того, как я нажал "сохранить".

Моя модель:

namespace Itucation.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    [Table("jobcoach")]
    public partial class jobcoach
    {

        public int kursist_id { get; set; }

        //[Column(TypeName = "text")]
        public string note { get; set; }

        [Key]
        public int jobcoach_note_id { get; set; }

        [Column("status")]
        //[StringLength(50)]
        [Display(Name = "Status")]
        public string status { get; set; }

        [Column(TypeName = "date")]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Success dato")]
        public DateTime? succesDato { get; set; }

        public int? AntalSamtaler { get; set; }

        public virtual kursister kursister { get; set; }

    }
}

Мой контроллер:

// GET: jobcoach/Create
    public ActionResult Create(int? id)
    {
        ViewBag.kursist_id = new SelectList(db.kursister, "kursist_id", "fornavn");
        ViewBag.status = new SelectList(db.JobcoachStatus, "status", "status");
        ViewBag.ID = id;
        ViewBag.kursist = (from k in db.kursister
                           where k.kursist_id == id
                           select k);
        //var jc = db.jobcoach.Where(u => u.kursist_id == id).ToList().FirstOrDefault();
        var jc = db.jobcoach.Where(r => r.kursist_id == id).ToList().FirstOrDefault();
        if (jc == null)
        {
            // param is not set
        }
        else
        {
            return RedirectToAction("Edit/" + jc.jobcoach_note_id);

        }
        return View();
    }

    // POST: jobcoach/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "jobcoach_note_id,kursist_id,note,status,succesDato, AntalSamtaler")] jobcoach jobcoach)
    {
        if (ModelState.IsValid)
        {
            //Brugernavn (current user) skal også indsættes
            jobcoach.note = jobcoach.note + " Af " + User.Identity.Name + " - " + DateTime.Now.ToString();
            db.jobcoach.Add(jobcoach);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.kursist_id = new SelectList(db.kursister, "kursist_id", "fornavn", jobcoach.kursist_id);
        return View(jobcoach);
    }

My View:

@model Itucation.Models.jobcoach

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <div>
        <h4>jobcoach</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div>
            @Html.LabelFor(model => model.kursist_id, "Kursist", htmlAttributes: new { @class = "control-label " })
            <div>
                @{
                    foreach (var navn in (ViewBag.kursist))
                    {
                        <text>Kursist ID: </text>@navn.kursist_id <br />
                        <text>Navn:</text> @navn.fornavn<text> </text> @navn.efternavn <br />
                        <text>E-mail: </text>@navn.mail
                    }
                }

                <input type="hidden" name="kursist_id" id="kursist_id" value="@ViewBag.ID" />
                @*@Html.DropDownList("kursist_id", null, htmlAttributes: new { @class = "form-control" })*@
                @Html.ValidationMessageFor(model => model.kursist_id, "", new { @class = "text-danger" })
            </div>
        </div>

        <div>
            @Html.LabelFor(model => model.note, htmlAttributes: new { @class = "control-label " })
            <div>
                @Html.TextAreaFor(model => model.note, new { @class = "form-control", @cols = "100%", @rows = "20", @tabindex = "21" })
                @Html.ValidationMessageFor(model => model.note, "", new { @class = "text-danger" })
            </div>
        </div>

        <div>
            Status
            <div>
                <select id="status">
                    <option value="Uden status">Uden status </option>
                    <option value="Ordinær uddannelse">Ordinær uddannelse</option>
                    <option value="Deltidsjob">Deltidsjob</option>
                    <option value="Praktik">Praktik</option>
                    <option value="Løntilskud privat">Løntilskud privat</option>
                    <option value="Løntilskud offentlig">Løntilskud offentlig</option>
                    <option value="Ordinært job">Ordinært job</option>
                </select>
            </div>
        </div>

        <div>
            Success dato
            <div>
                <input type="date" id="succesDato" name="succesDato" />
            </div>
        </div>

        <div>
            Antal samtaler
            <div>
                <input type="text" id="AntalSamtaler" name="AntalSamtaler" value="@Model.AntalSamtaler"/>
            </div>
        </div>
        @*<div>
                @Html.LabelFor(model => model.status, htmlAttributes: new { @class = "control-label " })
                <div>
                    <select id="status" name="status" class="form-control ">
                        <option>Vælg evt. en status</option>
                        <option value="Ordinært job">Ordinært job</option>
                        <option value="Ordinær uddannelse">Ordinær uddannelse</option>
                        <option value="Deltidsjob">Deltidsjob</option>
                        <option value="Praktik">Praktik</option>
                        <option value="Løntilskud privat">Løntilskud privat</option>
                        <option value="Løntilskud offentlig">Løntilskud offentlig</option>
                    </select>
                </div>
            </div>*@
        <div class="form-group col-md-12">
            <div class="col-md-offset-2 col-md-1">
                <input type="submit" value="Opret" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div class="col-md-10">
    @Html.ActionLink("Tilbage til listen", "Index")
</div>

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

Я бы ожидал «пустой» вид со всеми полями ввода, где я мог бы ввести дату и нажать «Сохранить». Вместо этого я получаю ошибку.

Ошибка возникает в строке: @Html.ValidationMessageFor(model => model.note, "", new { @class = "text-danger" }).

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

Буду очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я обнаружил проблему: я пытался получить доступ к @ Model.AntalSamtaler, но это было нулевым, поскольку я еще не сохранил его.Я изменил строку:

<input type="text" id="AntalSamtaler" name="AntalSamtaler" value="@Model.AntalSamtaler"/>

на:

<input type="text" id="AntalSamtaler" name="AntalSamtaler" value="1"/>

Я сделал эту ошибку, скопировав / вставив из представления "edit", где был установлен @ Model.AntalSamtaler.

0 голосов
/ 17 июня 2019

Это потому, что вы используете связь между представлением и моделью типа jobcoach. В представлении, если вы хотите связать представление с моделью, вы должны передать его в качестве параметра в методе контроллера View () следующим образом:

jobcoach jc=new jobcoach();
  return View(jc);

То, что вы сейчас пытаетесь сделать, это визуализировать представление create из "нулевой" модели, поскольку вы используете помощники методов с типом модели @Html (LabelFor, ValidationMessageFor ....)

Таким образом, когда он пытается связать представление с моделью, выдается ошибка, потому что в представлении не установлено свойство Model.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...