【发布时间】:2017-06-07 13:14:20
【问题描述】:
用户点击搜索按钮后,我想显示一个包含信息字段的列表,除了图像之外,一切都很好。我有一个 ActionResult 方法,它从视图中获取一个 Id 并在点击事件时向用户显示图像。
到目前为止的问题是,在控制器中,即使“item.Image.ImageId”具有 Id 值,左侧部分(我发送到视图的模型)也会引发 Null 引用异常,因此我无法传递 Image Id使用 'href = "~/Process/..."' 到视图
屏幕截图错误:Object reference not set to an instance of an object.
我的控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(SearchModel FormModel)
{
int districtNo = Convert.ToInt32(FormModel.DistrictNo);
List<SearchModel> ResultsList = new List<SearchModel>();
IQueryable<LetterInfo> DbQueries = // Get result from db
foreach (var item in DbQueries.ToList())
{
FormModel.FirstName = item.FirstName;
FormModel.LastName = item.LastName;
...
FormModel.Image.ImageId = item.Image.ImageId;
// FromModel.Image.ImageId - null reference exception
ResultsList.Add(FormModel);
}
ViewBag.ResultsToView = ResultsList;
}
return View(new SearchModel());
}
SearchModel 类:
public class SearchModel
{
.
.
.
public Image Image { get; set; }
}
LetterInfo 类:
public class LetterInfo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int LetterId { get; set; }
.
.
.
public virtual Image Image { get; set; }
}
返回图片文件的方法:
public ActionResult ViewImage(int Id)
{
var img = db.Images.First(a => a.ImageId == Id);
var stream = new MemoryStream(img.FileContents);
var lname = "letter" + Path.GetExtension(img.FileName)?.ToLower();
Response.AppendHeader("Content-Disposition", $"inline; filename={lname}");
return File(stream, Helpers.GetMimeType(img.FileName));
}
查看:
@model SearchModel
@section scripts{
<script type="text/javascript">
var win;
$('#openImage').click(function (event) {
event.preventDefault();
win = window.open(this.href, 'child', 'resizable=1');
return false;
});
</script>
}
...
@foreach (var item in ModelList){
<li></li>
...
<li class="list-group-item">
<a href="~/Process/ViewImage/@item.Image.ImageId" id="openImage">
<!-- On click open image file -->
<span>Click to see image</span>
</a>
</li>
}
【问题讨论】:
-
您正在尝试将属性分配给空的 Image 对象。试试这个实际操作索引:
FormModel.Image = item.Image; -
不只是
FormModel.Image为空吗?为什么不这样做FormModel.ImageId = item.Image?.IdImage ?? -1并在ViewImage方法中检查-1 并返回null。 (或将ImageId的类型更改为可为空并检查是否为空)
标签: c# asp.net asp.net-mvc entity-framework asp.net-identity