Asp.net mvc ASP.NET MVC序列不包含任何元素
我的HomeController中有以下代码:Asp.net mvc ASP.NET MVC序列不包含任何元素,asp.net-mvc,Asp.net Mvc,我的HomeController中有以下代码: public ActionResult Edit(int id) { var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First(); return View(ArticleToEdit); } [ValidateInput(false)] [AcceptVerbs(H
public ActionResult Edit(int id)
{
var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
return View(ArticleToEdit);
}
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
if (!ModelState.IsValid)
return View(originalArticle);
_db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
这是编辑方法的视图:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
领域
大字标题
故事(允许使用HTML)
图像URL
当我点击提交按钮时,我得到了一个错误:序列在这一行中不包含任何元素:var originalaarticle=(从_db.ArticleSet中的m开始,其中m.storyId==ArticleToEdit.storyId选择m)代码>
有什么问题?我该怎么修呢。谢谢问题是在\u db.ArticleSet
中没有与linq查询匹配的内容。第一个将抛出一个空集合
如果可以返回null,请尝试FirstOrDefault()
<如果没有匹配项,code>firstOrDetail()
将返回null。问题是在\u db.ArticleSet
中没有匹配linq查询的项。第一个将抛出一个空集合
如果可以返回null,请尝试
FirstOrDefault()
<如果没有匹配项,code>firstOrDetail()将返回null。您的HTML表单中没有包含文章的ID。如果调试ArticleToEdit对象,则该对象可能为null或没有storyId
您应该在HTML表单中包含您的storyId。如果不想让用户看到,可以将其作为隐藏字段。例如:
<% using (Html.BeginForm()) {%>
<%= Html.HiddenFor("storyId") %>
...
...
另一方面,您可能应该切换到使用而不是使用。First表示需要集合中的第一项。Single表示您应该得到一个且只有一个结果。您的HTML表单中没有包含文章的ID。如果调试ArticleToEdit对象,则该对象可能为null或没有storyId 您应该在HTML表单中包含您的storyId。如果不想让用户看到,可以将其作为隐藏字段。例如:
<% using (Html.BeginForm()) {%>
<%= Html.HiddenFor("storyId") %>
...
...
另一方面,您可能应该切换到使用而不是使用。First表示需要集合中的第一项。Single表示您应该只得到一个结果。您需要确保的是,在编辑记录时,您需要告诉数据库要编辑的记录。在querystring中包含ID是不够的,除非您明确告诉模型使用该ID(请参见我的第二个选项),但是最简单的方法是在表单中添加字段
<% using (Html.BeginForm()) {%>
<%= Html.HiddenFor("storyId") %>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
我还建议使用类似于将
ArticleToEdit
映射到ArticleSet
的东西,这样您就不需要进行额外的数据库查找来获取原始文章。基本上,如果您能够将ArticleToEdit
映射到ArticleSet
模型,那么您可以使用LINQ to SQL执行更新,而无需首先查询storyId。您需要确保的是,在编辑记录时,您需要告诉数据库要编辑的记录。在querystring中包含ID是不够的,除非您明确告诉模型使用该ID(请参见我的第二个选项),但是最简单的方法是在表单中添加字段
<% using (Html.BeginForm()) {%>
<%= Html.HiddenFor("storyId") %>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
我还建议使用类似于将
ArticleToEdit
映射到ArticleSet
的东西,这样您就不需要进行额外的数据库查找来获取原始文章。基本上,如果您能够将article-toedit
映射到article-set
模型,那么您可以使用LINQ-to-SQL执行更新,而无需首先查询故事ID。好的,我该怎么做?谢谢。用一个例子更新了答案。为什么它需要这个隐藏的表单呢?为什么控制器和url中的id的组合不足以告诉表单它正在编辑什么?谢谢还有第二个问题,请看原始问题。谢谢。关于第二个问题,请看:好的,我该怎么做?谢谢。用一个例子更新了答案。为什么它需要这个隐藏的表单呢?为什么控制器和url中的id的组合不足以告诉表单它正在编辑什么?谢谢还有第二个问题,请看原始问题。谢谢。关于第二个问题,请参见:和