“创建视图”将重定向到自身

时间:2015-11-27 18:23:00

标签: c# asp.net-mvc asp.net-mvc-4

我一直在尝试自动增加我的ID(BookId)。所有视图都在工作(编辑,删除,详细信息,索引),但创建一个视图效果不佳,因为每次我尝试添加新书时它都会重定向到自身。

在我的控制器中,我有以下内容:

public ActionResult Create()
{
    return View();
}

//
// POST: /Book/Create

[HttpPost]
public ActionResult Create(tbBooks tbbooks)
{
    if (ModelState.IsValid)
    {
        db.tbBooks.Add(tbbooks);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(tbbooks);
}

在Create.cshtml中:

@using (Html.BeginForm("Create","Book")){
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>tbBooks</legend>

        <div class="editor-label">
            @Html.HiddenFor(model => model.BookId)
        </div>
        <div class="editor-field">
            @Html.HiddenFor(model => model.BookId)    
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset> 
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

我已经使用表创建了数据库,并且使用Identity Specification = Yes设置了“BookId”列。 enter image description here

你可以给我任何帮助我会很感激, 问候。

2 个答案:

答案 0 :(得分:0)

嗯,这里有很多事情要发生:

首先,如果它是[HttpGet](在第一种方法中),您最好在Create方法中指定。

其次,您的观点有:

@Html.HiddenFor(model => model.BookId)

一旦你没有将[HttpGet]方法中的任何值传递给你的观点,这没有任何意义。

第三,不常为隐藏字段放置标签。您通常不想显示隐藏的字段。

此外,对于数据库中的结构,您可能需要在视图中填写字段名称,价格等。如果您的ID自动递增,您可能不需要自己处理,数据库会为您执行此操作。

最后,当您提交表单时,可能发生的情况是下面的if命令为false(您可以放置​​断点并检查):

if (ModelState.IsValid)

所以执行的下一个命令是:

return View(tbbooks);

这使您返回到View本身。我很惊讶你没有收到任何错误。我建议你看一些教程并实际使用Visual Studio脚手架代码,它已经包含了一些关于工作原理的很好的指标。

答案 1 :(得分:0)

您的ModelState.IsValid属性返回false,因此它正在执行Return View(tbbooks) line。这意味着您的表单未提供所有必需的值/根据数据注释定义,某些值是不可接受的。

要知道哪些戒律失败,请在剃须刀视图中

@Html.ValidationSummary(true)更改为@Html.ValidationSummary()

再次提交添加表单。您将看到验证错误

传递给ValidationSummary overload的布尔参数告诉系统排除属性错误。这就是为什么你看不到它们。

public static MvcHtmlString ValidationSummary(
    this HtmlHelper htmlHelper,
    bool excludePropertyErrors
)