ASP.Net MVC 2 - нажатие кнопки на представлении не вызывает какой-либо метод в контроллере? что мне не хватает? - PullRequest
0 голосов
/ 30 октября 2010

Я пробую свои силы на asp.net mvc2 и использую шаблон mvc2 для работы. Следуя шаблону, я создал свою собственную модель, контроллер и просмотр там соответствующих папок. я также изменил маршрутизацию по умолчанию в global.asax для этого контроллера и просмотра. теперь мое представление загружается, но когда я нажимаю кнопку в моем представлении, ни один из методов, которые я написал в моем контроллере, не получает удар в чем может быть причина, чего мне не хватает? я также хочу вызвать метод предварительной загрузки из моего контроллера, прежде чем мое представление будет отображено. пожалуйста, помогите ... я застрял. вот мой взгляд

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<CreditCashAllocationSystem.Models.ConfigurationModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Configuration
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Configuration</h2>

    <% using (Html.BeginForm()) {%>
        <%= Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                <%= Html.LabelFor(model => model.DropOffDaysForward) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.DropOffDaysForward) %>
                <%= Html.ValidationMessageFor(model => model.DropOffDaysForward) %>
            </div>

            <div class="editor-label">
                <%= Html.LabelFor(model => model.DropOffDaysBackward) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.DropOffDaysBackward) %>
                <%= Html.ValidationMessageFor(model => model.DropOffDaysBackward) %>
            </div>

            <div class="editor-label">
                <%= Html.LabelFor(model => model.DealDropOffDateDays) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.DealDropOffDateDays) %>
                <%= Html.ValidationMessageFor(model => model.DealDropOffDateDays) %>
            </div>

            <div class="editor-label">
                <%= Html.LabelFor(model => model.DealHistoryDays) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.DealHistoryDays) %>
                <%= Html.ValidationMessageFor(model => model.DealHistoryDays) %>
            </div>

            <div class="editor-label">
                <%= Html.LabelFor(model => model.UnappliedHistoryDays) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.UnappliedHistoryDays) %>
                <%= Html.ValidationMessageFor(model => model.UnappliedHistoryDays) %>
            </div>

            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%= Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

и вот мой контроллер:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CreditCashAllocationSystem.Controllers
{
    public class ConfigurationController : Controller
    {

        //
        // GET: /Configuration/Create

        //will be called on Form Load
        public ActionResult Create()
        {
            return View("Configuration");
        } 

        //
        // POST: /Configuration/Create


        //Method will be called once u click on create/save button
        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                return View("Configuration");
            }
            catch
            {
                return View("Configuration");
            }
        }
    }
}

а вот мой Global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace CreditCashAllocationSystem
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Configuration", action = "Create", id = UrlParameter.Optional } // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Пожалуйста, помогите, чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 31 октября 2010

Вам необходимо указать контроллер и действие при вызове BeginForm

<% using(Html.BeginForm("Create", "Configuration")) {%>
0 голосов
/ 31 октября 2010

ваш код выглядит хорошо, в конце концов он работает нормально, поэтому я не уверен, что это правильный или неправильный ответ.

но если он не работает, вы можете попробовать решить первую проблему

    [HttpGet]
    public ActionResult Create()
    {
        return View("Configuration");
    }

    [HttpPost]
    public ActionResult Create(FormCollection collection)
    {


    //your code
    }

и для вашей ссылки (Вернуться к списку) вам нужно

    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }

и еще один, по вашему мнению, вы должны включить клиентский скрипт проверки подлинности

<% Html.EnableClientValidation (); %>

и ваш второй ответ

    //after your action executed
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //your code
        base.OnActionExecuted(filterContext);
    }



    //before your action execute
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //your code
        base.OnActionExecuting(filterContext);
    }
0 голосов
/ 30 октября 2010

Этот метод должен вызываться, когда вы нажимаете кнопку, но все, что вы делаете, возвращается прямо к тому же представлению:

[HttpPost]
public ActionResult Create(FormCollection collection)
{
    try
    {
        // TODO: Add insert logic here
        //Seriously, add some code here, or all you do is go back to the same view.
        return View("Configuration");
    }
    catch
    {
        return View("Configuration");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...