2

У меня есть веб-приложение с этим контроллером:NullReferenceException ASP.NET MVC 5

public class ServiceRequestController : Controller 
    { 

    [Authorize(Roles = "Customer")] 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    [Authorize(Roles = "Customer")] 
    public ActionResult CreateNewUserAccount() 
    { 
     return View(); 
    } 

    [Authorize(Roles = "Customer")] 
    [HttpPost] 
    public ActionResult CreateNewUserAccount(ServiceRequest serviceRequest) 
    { 
     if (ModelState.IsValid) 
     { 
      serviceRequest.Log.Id = User.Identity.GetUserId().ToString(); 
      serviceRequest.Log.DateTimeLogged = System.DateTime.Now; 
      serviceRequest.LogID = db.Logs.Max(item => item.LogID); 
      serviceRequest.EstimatedResolveDate serviceRequest.CalculateEstimatedResolveDate(); 
      db.ServiceRequests.Add(serviceRequest); 
      db.SaveChanges(); 
      return RedirectToAction("AllServiceRequests", "Log"); 
     } 
     return View(serviceRequest); 
    } 

serviceRequest.Log.Id = User.Identity.GetUserId().ToString(); (А любая предшествующая линия, если это закомментирована) выбрасывает пустой ссылкой исключение. Я полагаю, что serviceRequest как-то недействителен?

ActionLink, который запрашивает страницу CreateNewUserAccount() является:

@Html.ActionLink("New User Account", "CreateNewUserAccount", "ServiceRequest") 

Я не знаю, как разрешить это исключение?

Модель:

public partial class ServiceRequest 
{ 
    public int ServiceRequestID { get; set; } 
    public Nullable<int> LogID { get; set; } 
    public string RequestType { get; set; } 
    [DisplayName("Additional Information")] 
    [Required] 
    [StringLength(200)] 
    public string AdditionalInformation { get; set; } 
    public DateTime EstimatedResolveDate { get; set; } 

    [Required] 
    [DisplayName("Delivery Date")] 
    public DateTime DeliveryDate { get; set; } 

    public virtual Log Log { get; set; } 


    public DateTime CalculateEstimatedResolveDate() 
    { 
     return System.DateTime.Now.AddDays(3); 
    } 

} 

Посмотреть код:

@model OfficiumWebApp.Models.ServiceRequest 

@{ 
ViewBag.Title = "New User Account"; 
} 
@using(Html.BeginForm("CreateNewUserAccount", "ServiceRequest", FormMethod.Post)) 
{ 
@Html.AntiForgeryToken() 
<div class="form-horizontal"> 
    @Html.ValidationSummary(true) 

    <div class="form-group"> 
     @Html.LabelFor(model => model.RequestType, new { @class = "control-label col-md-2" }) 
     <div class="col-md-3"> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.RequestType, new { @Value = ViewBag.Title, @readonly = "readonly" }) 
       @Html.ValidationMessageFor(model => model.RequestType) 
      </div> 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.Label("Name of Account Holder", new { @class = "control-label col-md-2" }) 
     <div class="col-md-3"> 
      <div class="editor-field"> 
       @Html.TextBox("AccountName") 
       @Html.ValidationMessageFor(model => model.RequestType) 
      </div> 
     </div> 
    </div> 

    <div class="form-group"> 
    @Html.Label("Department", new { @class = "control-label col-md-2" }) 
    <div class="col-md-3"> 
     <div class="editor-field"> 
      @Html.TextBox("Department") 
      @Html.ValidationMessageFor(model => model.RequestType) 
     </div> 
    </div> 
</div> 

<div class="form-group"> 
     @Html.Label("Location", new { @class = "control-label col-md-2" }) 
     <div class="col-md-3"> 
      <div class="editor-field"> 
       @Html.TextBox("Location", null, new { id = "Location" })) 
       @Html.ValidationMessageFor(model => model.RequestType) 
      </div> 
     </div> 
    </div> 


    <div class="form-group"> 
     @Html.LabelFor(model => model.AdditionalInformation, new { @class = "control-label col-md-2" }) 
     <div class="tags"> 
      <div class="col-md-10"> 
       @Html.TextAreaFor(model => model.AdditionalInformation) 
       @Html.ValidationMessageFor(model => model.AdditionalInformation) 
      </div> 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.DeliveryDate, new { @id = "VisitDateLabel", @class = "control-label col-md-2" }) 
     <div class="col-md-3"> 
      <div class="editor-field"> 
       @Html.JQueryUI().DatepickerFor(model => model.DeliveryDate).Inline(false) 
       @Html.ValidationMessageFor(model => model.DeliveryDate) 
      </div> 
     </div> 
    </div> 
     <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-floppy-save"></span></button> 
     </div> 
    </div> 
</div> 
} 
+0

Можем ли мы увидеть модель «ServiceRequest»? – Dayan

+0

Добавили модель – ASPCoder1450

+2

serviceRequest.Log - null, serviceRequest должно быть хорошо –

ответ

2

Вы должны вернуть мнение, т.е.

[Authorize(Roles = "Customer")] 
public ActionResult CreateNewUserAccount() 
{ 
    var model = new ServiceRequest(); 
    model.Log = new Log(); 
    return View(model); 
} 

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

@model ServiceRequest 

Вы также можете инициализировать Log объект в модели следующим образом:

public class ServiceRequest 
{ 
    public ServiceRequest() 
    { 
     Log = new Log(); 
    } 

    .... 
} 

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

@using (Html.BeginForm("CreateNewUserAccount", "ServiceRequest", FormMethod.Post)){ 

    @Html.EditorFor(m => m.AdditionalInformation) 
    ... 
    <input type="submit" value="submit" /> 

Update

Взятые из приведенных ниже комментариев, Thi s был разрешен путем создания нового журнала после сообщения, то есть

var log = new Log { 
    Id = User.Identity.GetUserId().ToString(), 
    DateTimeLogged = System.DateTime.Now, 
    LogID = db.Logs.Max(item => item.LogID) }; 
serviceRequest.Log = log; 
+0

Хорошо. Я сделал первое изменение, но это не имело значения. Второй, который у меня уже был, и третий я уже имею «публичный виртуальный журнал журнала {get; задавать; } 'это в классе ServiceRequest – ASPCoder1450

+0

@ ASPCoder1450 Привет, вы также видели мое обновление с формой? :) – hutchonoid

+0

@hutconoid да, я добавил это сейчас, но могу подтвердить, что он не имеет значения – ASPCoder1450