Страница бритвы не вызывает правильный метод контроллера - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок на страницах Razor и мне нужна помощь.

У меня есть файл .CSHTML, который определяет страницу.Эта страница содержит несколько флажков для пользователя, чтобы проверить или снять флажок.Страница устанавливает состояния этих флажков в соответствии с используемой ими моделью представления.Однако, когда я нажимаю кнопку «Сохранить», приложение вылетает, говоря, что не может найти метод, который принимает 0 аргументов.Как мне сделать так, чтобы он возвращал viewmodel к моему методу сохранения ниже?Некоторые пути к файлам опущены из соображений конфиденциальности.

Я пытался использовать форму (как в примере) и установить обработчик на кнопку, которая заставила его перейти к несуществующей ссылке.Intellisene находит контроллер и метод, чтобы они были видны.

My View:

@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 голосов
/ 19 декабря 2018

Единственное объяснение того, почему вы не можете запустить действие Сохранить после нажатия кнопки на стороне клиента, заключается в том, что вы не добавили

    //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 }
    );
}
0 голосов
/ 19 декабря 2018

удалось исправить.Решением было добавить пустой конструктор для Viewmodel.

0 голосов
/ 19 декабря 2018

Сначала вам нужно добавить MapMvcAttributeRoutes () в RouteConfig в папке Appdata

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...