2014-02-24 107 views
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爲空,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" /> 

更新

從下面的評論採取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