剃刀页面未调用正确的控制器方法

时间:2018-12-19 16:41:44

标签: c# asp.net-mvc razor model-view-controller

我是Razor页面的新手,需要一些帮助。

我有一个.CSHTML文件,它指定一个页面。该页面包含几个复选框,供用户选中或取消选中。该页面根据它们所使用的视图模型设置这些复选框的状态。但是,当我按下“保存”按钮时,应用程序崩溃,原因是它找不到任何带有0个参数的方法。如何使其将viewmodel返回到下面的save方法?由于隐私原因,一些文件路径被省略。

我尝试使用表单(如示例中)并在按钮上设置设置处理程序,这导致它导航到不存在的链接。 Intellisene确实找到了控制器和方法,因此它们是可见的。

我的视图:

@model Models.MenuItemsViewModel

@{
    ViewBag.Title = "Menus";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="jumbotron">
    <h1 class="display-4">@ViewBag.Title</h1>
    <p>here you can set values</p>
</div>

@using (Html.BeginForm("Save", "MenuItems", FormMethod.Post))
{
    <h2>Menus</h2>
    <table class="table">
        <thead>
            <tr>
                <th scope="col">Name</th>
                <th scope="col">Status</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    @Html.LabelFor(m => m.Schedule)
                </td>
                <td> @Html.CheckBoxFor(m => m.Schedule, new { @checked = Model.Schedule }) </td>
            </tr>
            <tr>
                <td>
                    @Html.LabelFor(m => m.FAQ)
                </td>
                <td> @Html.CheckBoxFor(m => m.FAQ, new { @checked = Model.FAQ }) </td>
            </tr>   
        </tbody>
    </table>

    <input type="submit" value="Save these values" class="btn btn-primary btn-block"  />
}

我的控制器:

using System.Linq;
using System.Threading.Tasks;
using System.Web.Mvc;
using Models;

namespace Controllers
{
    [RoutePrefix("menuItems")]
    [Authorize(Roles = LoginController)]
    public class MenuItemsController : Controller
    {
        private readonly AppContext context = new AppContext();

        [Route("")]
        public async Task<ActionResult> Index()
        {
            var menuItems = context.MenuItems.SingleOrDefault();
            return View(new MenuItemsViewModel(menuItems));
        }

        [HttpPost] //I want to call this method when I press save!
        public ActionResult Save(MenuItemsViewModel model)
        {
            var menuItems = context.MenuItems.SingleOrDefault();

            if (menuItems == null)
            {
                ViewBag.Message = "Something went wrong";
            }

            model.UpdateFromViewModel(menuItems);

            ViewBag.Message = "Information saved";
            context.SaveChanges();
            return RedirectToAction("Index");}
    }
}

我希望更新Viewmodel并在对Save方法的调用中发送它,以便将其保存到数据库中。

3 个答案:

答案 0 :(得分:1)

单击客户端上的按钮后为何无法运行“保存”操作的唯一解释是,因为您没有添加

    //enable attribute routing
    routes.MapMvcAttributeRoutes();

到您的RouteConfig.cs文件。它应该看起来像这样:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //enable attribute routing
    routes.MapMvcAttributeRoutes();

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

答案 1 :(得分:0)

首先,您需要将MapMvcAttributeRoutes()添加到Appdata文件夹中的RouteConfig

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

然后更改menuItem控制器,如下图所示

    [RoutePrefix("menuItems")]
public class MenuItemController : Controller
{
    // GET: MenuItem
    [Route("Index")]
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost] 
    [Route("Save")] // put the route attribuate 
    public ActionResult Save(MenuItemsViewModel model)
    {
        ViewBag.Message = "Information saved";
        return RedirectToAction("Index");
    }
}

答案 2 :(得分:0)

设法修复它。解决方案是为Viewmodel添加一个空的构造函数。