Параметры ASP.MVC не переданы методу Action для сообщения http - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь вызвать метод Action, передавая один параметр.

Метод (Accepts Http Posts) срабатывает при нажатии кнопки отправки (после диалогового окна, выдаваемого через сценарий java для подтверждения пользователем). Однако значение, переданное в метод действия, всегда равно null. Ниже приведен фрагмент исходного кода страницы, отображаемого в браузере. Это показывает две типичные строки. Других элементов «Форма» на странице нет.

Любые идеи относительно того, почему значение не передается.

Спасибо

Grant

<tr class="inactive-row">
    <td>Title1</td>
    <td></td>
    <td>01 January 2010</td>
    <td>
        <form action="/Admin/Delete/1" method="post" onsubmit="return confirmDelete()">
            <input type='image' src='/Content/delete.gif' value='delSubmit' alt='Delete' />         
    </td>
</tr>

<tr class="inactive-row">
    <td>Title2</td>
    <td></td>
    <td>01 January 0001</td>
    <td>
        <form action="/Admin/Delete/2" method="post" onsubmit="return confirmDelete()">
            <input type='image' src='/Content/delete.gif' value='delSubmit' alt='Delete' />         
    </td>
</tr>

Спасибо за вашу помощь. Ниже приведен код global.asax:

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 = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

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

AdminController:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
using System.Xml.XPath;
using DataGridInMVC.Models;

namespace DataGridInMVC.Controllers
{
    public class AdminController : Controller
    {
        private XDocument document;
        //
        // GET: /Admin/

        public ActionResult Index(int ? PageNumber)
        {
            var data = GetPostData(PageNumber);
            //Build the model and then Sent to the View
            return View(data);
        }

        private MyAdminDataModel GetPostData(int? pageNumber)
        {
            document = XDocument.Load(Server.MapPath("~/App_Data/Posts.xml"));
            var elList = from el in document.Descendants("Post")
                         select new Page { ID = (string)el.Attribute("ID"), PermaLink=(string)el.Attribute("PermaLink"), Title = (string)el.Attribute("Title") };

           return new MyAdminDataModel { CurrentPage = pageNumber ?? 0, Pages = elList, TotalPages = 2 };
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(int ? delId)
        {
            document.XPathSelectElement(String.Format("Posts/Post[@ID = '{0}']",delId )).Remove();
            document.Save(Server.MapPath("~/App_Data/Posts.xml"));
            var model = GetPostData(null);
            return View("Index",model);
        }
    }
}

Методы расширения для htmlHelper:

public static string DeleteForm(this HtmlHelper helper, string controller, string action, int id)
{
    //UrlHelper url = new UrlHelper(helper.ViewContext);
    UrlHelper url = new UrlHelper(helper.ViewContext.RequestContext);
    string postAction = url.Action(action, controller, new { id = id });

    string formFormat = "<form action=\"{0}\" method=\"post\" onsubmit=\"return confirmDelete()\"/>";
    return string.Format(formFormat, postAction);
}


public static string SubmitImage(this HtmlHelper helper, string imageName, string imageFile, string altText)
{  
    return string.Format("<input type='image' src='{0}' value='{1}' alt='{2}' />", imageFile, imageName, altText);
}

Код, который я имею, взят из блога Роба Конери http://blog.wekeroad.com/blog/asp-net-mvc-avoiding-tag-soup/

1 Ответ

3 голосов
/ 04 июня 2010

В приведенном выше коде я думаю, что вам не хватает закрывающих тегов для тегов form.

РЕДАКТИРОВАТЬ: По любой причине, по которой вы не хотите использовать Html.ActionLink вместокнопка отправки, так как похоже, что вам не нужно отправлять данные формы, а ActionLink - хороший индикатор?

РЕДАКТИРОВАТЬ 2: Попробуйте изменить свой контроллер Delete определение методаto:

public ActionResult Delete(int? id) 

Я думаю, что это не может соответствовать параметрам правильно.Я только что проверил ваш код и имя параметра определенно является проблемой.Я смог воспроизвести ту же проблему, но переименовав ее в id, решил ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...