我正在嘗試提供一個包含資料庫行串列的表,以及一個小表單選項,供用戶添加額外的資料庫行。我制作了兩個模型來保存表格行并捕獲表格。我對表格模型沒有問題,只是表格模型。
所以我相信問題出在我的控制器上;我是 MVC 的新手,這是我第一次在同一個 VM 中看到兩個模型……我一直在對事物進行一些小的更改,但我的控制器中不斷出現空參考錯誤。
虛擬機:
namespace User.ViewModel
{
public class UploadDocumentTemplatesViewModel
{
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModel
{
public UploadDocumentTemplatesViewModel NewTemplate { get; set; }
public List<UploadDocumentTemplatesViewModel> Templates { get; set; }
}
}
查看(UploadDocumentTemplates.cshtml):
@using (Html.BeginForm("AddNewTemplate", "User", 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">
<label for="comments">Comments:</label>
<textarea class="form-control" rows="5" id="comments" name="@Model.NewTemplate.Comments"></textarea>
<button id="AddTemplate" onclick="AddNewTemplate()" name="Add Template">Add Template</button>
</div>
}
<table>
<tbody>
@{ foreach (var template in Model.Templates)
{
<tr id="[email protected]">
<td>@template.TemplateName</td>
<td>@template.Comments </td>
<td>@template.IsActive </td>
}
<script>
function AddNewTemplate() {
$("#NewTemplateForm").submit();
}
</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)
{
var template = new DocumentTemplates();
template.TemplateName = vModel.NewTemplate.TemplateName;
template.Comments = vModel.NewTemplate.Comments;
entity.DocumentTemplates.Add(template);
entity.SaveChanges();
return View("~/User/UploadDocumentTemplates.cshtml", vModel);
}
}
我在控制器的 Post 方法中在這一行點擊了空參考:
template.TemplateName = vModel.NewTemplate.TemplateName;
vModel.NewTemplate.TemplateName 為空。誰能幫我這個?
太感謝了!
解決方案:
在安迪的幫助下,NRE 確實得到了解決(見答案)。在我使用表單中使用的欄位填充新 VM 后,我的進一步問題得到了解決。
namespace Example.Areas.ViewModel
{
public class UploadDocumentTemplatesViewModel
{
public long DocumentTemplateId { get; set; }
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModel
{
public string TemplateName { get; set; }
public string Comments { get; set; }
public HttpPostedFileBase TemplateFile { get; set; }
public List<UploadDocumentTemplatesViewModel> Templates { get; set; }
}
}
在控制器中,我填充了 TemplateModel 并將其發送到視圖:
public ActionResult UploadDocumentTemplates()
{
var templateList = Repository.GetTemplates();
var _obj = new TemplateModel
{
Templates = templateList.Select(x => new UploadDocumentTemplatesViewModel()
{
DocumentTemplateId = x.DocumentTemplateId,
TemplateName = x.TemplateName,
Comments = x.Comments
}).ToList()
};
return View(_obj);
}
然后我將@using Example.Areas.ViewModel.TemplateModel 放在我的視圖上,并在表格中使用了 Model.Templates,在表單中使用了 Model.TemplateName 和 Model.Comments。
uj5u.com熱心網友回復:
在您點擊空參考的行中添加一個斷點并檢查是否vModel.NewTemplate有一個有效的實體。
您可以在類中添加一個建構式TemplateModel來創建一個新的實體UploadDocumentTemplatesViewModel()
namespace User.ViewModel
{
public class UploadDocumentTemplatesViewModel
{
public string TemplateName { get; set; }
public string Comments { get; set; }
}
public class TemplateModel
{
public 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/caozuo/415878.html
標籤:
