【问题标题】:Navigate to new view on button click in ASP.NET Core 3.1 MVC在 ASP.NET Core 3.1 MVC 中单击按钮导航到新视图
【发布时间】:2020-10-22 06:30:28
【问题描述】:

我正在尝试通过单击按钮将用户导航到新页面。我在渲染新视图时遇到问题。每当我单击该按钮时,我要么在我的页面上收到一个下拉错误,要么我得到主页视图,但在 URL 中有我想要的路由。我想指出,用户将从主页导航到此页面,这是我在应用程序上制作的新登录页面。我想指出,以防我在这里所做的事情可以被修改。 How I created a new landing page

我想从我的登录页面导航到我的图书目录页面。

我的视图(在着陆页上):

<form method="post" asp-controller="Home" asp-action="Home" role="post">
    <div class="form-group">
        <label asp-for="bookName"></label>
        <select name="bookName" asp-items="@(new SelectList(ViewBag.message, "ID", "bookName"))">
</select>
    </div>
    <div class="form-group">
        <input type="submit" value="Submit" class="btn btn-primary" />
    </div>
</form>
<div class="row">
    <div class="form-group">
        <a asp-controller="BookInventory" asp-action="Index">
            <input type="button" value="Book Inventory Page" /> 
        </a>
    </div>
</div>

我的控制器(在我的登录页面上)

        public void GetBooksDDL()
        {
            List<BookModel> bookName = new List<BookModel>();
            bookName = (from b in _context.BookModel select b).ToList();
            bookName.Insert(0, new BookModel { ID = 0, bookName = "" });
            ViewBag.message = bookName;
        }

        [HttpGet("[action]")]
        [Route("/Home")]
        public IActionResult Home()
        {
            GetBooksDDL()
            return View();
        }

我的控制器(在我的图书目录页面上):

        [HttpGet("[action]")]
        [Route("/Index")]
        public IActionResult Index()
        {
            return View();
        }

我想指出,我的图书库存控制器上的断点确实命中了“return View()”,但它仍会从主页呈现项目。

图书下拉菜单显示的错误是:

ArgumentNullException:值不能为空。 (参数“项目”) Microsoft.AspNetCore.Mvc.Rendering.MultiSelectList.ctor(IEnumerable items, string dataValueField, string dataTextField, IEnumerable selectedValues, string dataGroupField)。

我想知道为什么我在尝试导航到其他页面时会收到此错误。由于这是新的登陆页面,它是否有可能将其所有数据传递到其余页面?

【问题讨论】:

  • 关于控制器上 Index() 和 Home() 操作上方的属性。我不明白他们为什么会有[Produces("application/json")] 它应该返回视图,而不是 JSON。也许应用程序 JSON 应该继续 GetBookDDL 方法。
  • @T3.0 您好,感谢您的回复!这是一个很好的收获,我将从我的代码中删除它,因为它不是必需的。我仍然遇到同样的问题。

标签: asp.net-core model-view-controller razor dropdown argumentnullexception


【解决方案1】:

ArgumentNullException:值不能为空。 (参数“项目”) Microsoft.AspNetCore.Mvc.Rendering.MultiSelectList.ctor(IEnumerable 项目,字符串 dataValueField,字符串 dataTextField,IEnumerable selectedValues,字符串数据组字段)。

关于这个错误,说明你没有给select元素设置值,在返回视图之前,请检查ViewBag.message的值,确保它包含值。

注意:请记得检查 post 方法,如果 Http Get 和 Post 方法返回相同的页面,请确保在两个 action 方法中都设置了 ViewBag.message 值。

我想注意我的图书库存控制器上的断点 确实击中了'return View()',但它仍然会从 主页。

在 BookInventory Controller 的 Index 操作方法中,右键单击并单击“Go to View”选项,确保已添加 Index 视图。

根据您的代码,我使用以下代码创建了一个示例,似乎一切正常。

Home 控制器中的代码:

    [HttpGet("[action]")]
    [Route("/Home")]
    public IActionResult Home()
    {
        GetBooksDDL();
        return View();
    }

    [HttpPost("[action]")]
    [Route("/Home")]
    public IActionResult Home(BookModel book, string bookName)
    {
        GetBooksDDL();
        //used to set the default selected value, based on the book id (bookName) to find the book.
        List<BookModel> booklist = (List<BookModel>)ViewBag.message;
        book = booklist.Find(c => c.ID == Convert.ToInt32(bookName));

        return View(book);
    }

主页视图中的代码:

@model BookModel
@{
    ViewData["Title"] = "Home";
}

<h1>Home</h1>

<form method="post" asp-controller="Home" asp-action="Home" role="post">
    <div class="form-group">
        <label asp-for="bookName"></label>
             <select name="bookName" asp-items="@(new SelectList(ViewBag.message, "ID", "bookName", Model == null? 0:Model.ID))">
        </select>
    </div>
    <div class="form-group">
        <input type="submit" value="Submit" class="btn btn-primary" />
    </div>
</form>
<div class="row">
    <div class="form-group">
        <a asp-controller="BookInventory" asp-action="Index">
            <input type="button" value="Book Inventory Page" />
        </a>
    </div>
</div>

BookInventory 控制器中的代码:

public class BookInventoryController : Controller
{
    [HttpGet("[action]")]
    [Route("/Index")]
    // GET: BookInventory
    public ActionResult Index()
    {
        return View();
    }

截图如下:

如果还是不行,请检查你的路由配置,可能是路由配置有问题。

【讨论】:

  • 感谢您的回复!我使用 Michelle 的方法调用我的新登录页面,并使用您的方法将值放入 ViewBag。
【解决方案2】:

您的锚标记格式不正确。您不能在锚标记中编写按钮。

做这样的事情:

<a asp-action="Index" asp-controller="BookInventory" class="btn btn-primary">Book Inventory Page</a>

这里的类将帮助你的锚标签看起来像按钮。我希望你在你的项目中使用了引导程序。如果没有,那就使用它。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    这是另一种简单的方法:

    <button type="button" class="btn" onclick="window.location.href = '/YourPage'">Button Title</button>
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      相关资源
      最近更新 更多