我試圖用資料庫中的行串列來展示一個表,以及一個小的表單選項來讓用戶添加額外的資料庫行。我做了兩個模型,以便同時保存表格行和捕獲表單。我在表格模型上沒有遇到問題,只是在表單模型上遇到問題。
所以我確信問題出在我的控制器上;我是 MVC 的新手,這是我第一次在同一個 VM 中看到兩個模型...... 我一直在來回地做一些小的修改,但是我的控制器一直出現空參考錯誤。
VM:
namespace User.ViewModel
{
public class UploadDocumentTemplatesViewModel {
{
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModelpublic UploadDocumentTemplatesViewModel NewTemplate { get; set; }
public List<UploadDocumentTemplatesViewModel> Templates { get; set; }
}
查看(UploadDocumentTemplates.cshtml):
@using (Html.BeginForm("AddNewTemplate"/span>, "User"/span>, FormMethod. Post, new { enctype = "multipart/form-data", id = "NewTemplateForm"})
{
@Html.AntiForgeryToken()
<div>
< input type="text" class="form-control" rows="5" id="TemplateName" value="@Model. NewTemplate.TemplateName">。
<標簽 for="comments"> Comments:</label>
<textarea class="form-control" rows="5" id="comments" name="@Model. NewTemplate.comments"></textarea>
<按鈕id="AddTemplate" onclick="AddNewTemplate()" name="Add Template">Add Template</button>
</div>
}
<table>
<tbody>
@{ foreach (var template in Model.Template)
{
<tr id="[email protected]"/span>>
<td>@template.TemplateName</td>
<td>@template.Comments </td>
<td>@template.IsActive </td>
}
<script>
function AddNewTemplate() {
$("#NewTemplateForm").提交()。
}
</script>
控制器:
public class UserController : Controller >。
{
public ActionResult UploadDocumentTemplates()
{
var model = entity.DocumentTemplates.Select(x => new UploadDocumentTemplatesViewModel()
{
DocumentTemplateId = x.DocumentTemplateId,
TemplateName = x.TemplateName,
Comments = x.Comments。
});
var _obj = new TemplateModel();
var templatelist = _entities.GetTemplates();
_obj.Templates = new List<UploadDocumentTemplatesViewModel>()。
foreach (var template in templatelist)
{
_obj.Templates.Add(new UploadDocumentTemplatesViewModel()
{
TemplateName = template.TemplateName,
Comments = template.Comments,
});
}
_obj.NewTemplate = new UploadDocumentTemplatesViewModel();
return View(_obj)。
}
[HttpPost] 。
[ValidateAntiForgeryToken]
public ActionResult AddNewTemplate(TemplateModel vModel) /span>
{
var template = new DocumentTemplates()。
template.TemplateName = vModel.NewTemplate.TemplateName;
template.Comments = vModel.NewTemplate.Comments;
物體.DocumentTemplates.Add(template)。
物體.SaveChanges()。
return View("~/User/UploadDocumentTemplates.cshtml", vModel) 。
}
我在控制器中的Post方法中的這一行遇到了一個Null Reference:
template.TemplateName = vModel.NewTemplate.TemplateName;
vModel.NewTemplate.TemplateName為空。誰能幫我解決這個問題?
非常感謝您的幫助。
非常感謝!
解決方法:
。解決方案:
在Andy的幫助下,NRE確實得到了解決(見答案)。在我把我在表單中使用的欄位填充到新的虛擬機中后,我的進一步問題得到了解決。
namespace Example.Areas.ViewModel
{
public class UploadDocumentTemplatesViewModel {
{
public long DocumentTemplateId { get; set; }
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModelpublic string TemplateName { get; set; }
public string Comments { get; set; }
public HttpPostedFileBase TemplateFile { get; set; }
public List<UploadDocumentTemplatesViewModel> Templates { get; set; }
}
在控制器中,我填充了TemplateModel,并將其發送給了View:
public ActionResult UploadDocumentTemplates()
{
var templateList = Repository.GetTemplates()。
var _obj = new TemplateModel
{
Templates = templateList.Select(x => new UploadDocumentTemplatesViewModel()
{
DocumentTemplateId = x.DocumentTemplateId,
TemplateName = x.TemplateName,
評論 = x.評論
}).ToList()
};
return View(_obj)。
}
然后我把@using Example.Areas.ViewModel.TemplateModel放在我的View上,在表格中使用Model.Templates,在表單中使用Model.TemplateName和Model.Comment。
uj5u.com熱心網友回復:
在你碰到Null Reference的那一行添加一個斷點,檢查vModel.NewTemplate是否有一個有效的實體。
你可以在TemplateModel類中添加一個建構式來創建一個UploadDocumentTemplatesViewModel()
namespace User.ViewModel
{
public class UploadDocumentTemplatesViewModel {
{
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModelpublic TemplateModel()
{
NewTemplate = new UploadDocumentTemplatesViewModel()。
}
public UploadDocumentTemplatesViewModel NewTemplate { get; set; }
public List<UploadDocumentTemplatesViewModel> Templates { get; set; }
}
或者
在實體化template后創建一個實體:
var template = new DocumentTemplates() 。
template.NewTemplate = new UploadDocumentTemplatesViewModel()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320341.html
標籤:
