我是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方法的调用中发送它,以便将其保存到数据库中。
答案 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添加一个空的构造函数。