Asp.net mvc ASP.NET MVC序列不包含任何元素

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

我的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(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的组合不足以告诉表单它正在编辑什么?谢谢还有第二个问题,请看原始问题。谢谢。关于第二个问题,请参见:和