开发者

Asp.net mvc - Html Submit button not sent with post?

As in the title. I use this method for allowing more than one submit button per form and more than one action to handle them.

However - for some odd reason - all of a sudden my submit button doesn't get submitted with the form!? any reason why that would happen?

tested using IE, FF, Chrome - all latest

View code:

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

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    SignUp
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm("SignUp", "SetUp", FormMethod.Post))
       {

    %>
    <%: Html.ValidationSummary()%>
    <button  type="submit" value="Register" name="ActionRegister" >Register</button>
    <button  type="submit" value="Cancel" name="ActionCancel" class="cancel" >Cancel</button>
    <fieldset>
        <legend>Account Information </legend>
        <dl>
            <dt>
                <%:Html.LabelFor(x=>x.UserName)%>
            </dt>
            <dd>
                <%: Html.TextBoxFor(x=>x.UserName) %>
                <%: Html.ValidationMessageFor(model => model.UserName) %>
            </dd>
            <% if (string.IsNullOrEmpty(Model.Provider))
               {    
            %>
            <dt>
                <%:Html.LabelFor(x=>x.Password)%>
            </dt>
            <dd>
                <%: Html.PasswordFor(x => x.开发者_Go百科Password)%>
                <%: Html.ValidationMessageFor(model => model.Password) %>
            </dd>
            <%
               } %>
            <dt>
                <%:Html.LabelFor(x=>x.Email)%>
            </dt>
            <dd>
                <%: Html.TextBoxFor(x=>x.Email) %>
                <%: Html.ValidationMessageFor(model => model.Email) %>
            </dd>
            <dt>
                <%:Html.LabelFor(x=>x.Themes) %>
            </dt>
            <dd>
                <%: Html.DropDownList("ThemeId", Model.Themes.Select(x=> new SelectListItem{ Text = x.DisplayName, Value = x.DisplayName}), "Select a Theme") %>
                <%: Html.ValidationMessageFor(model => model.Themes) %>
            </dd>
        </dl>
    </fieldset>
    <fieldset>
        <legend>
            <h2>
                Additional Information</h2>
        </legend>
        <dl>
            <dt>
                <%:Html.LabelFor(x=>x.PublicSite)%>
            </dt>
            <dd>
                <%:Html.CheckBoxFor(x => x.PublicSite)%>
                <%: Html.ValidationMessageFor(model => model.PublicSite) %>
            </dd>
            <dt>
                <%:Html.LabelFor(x=>x.SiteUrl)%>
            </dt>
            <dd>
                http://cheesyurl.com/<%:Html.TextBoxFor(x => x.SiteUrl)%>
                <%: Html.ValidationMessageFor(model => model.SiteUrl) %>
            </dd>
        </dl>
    </fieldset>
    <%
       }%>
</asp:Content>

Action:

    [HttpPost]
    [ActionName("SignUp")]
    [UnitOfWork]
    [AcceptParameter(Action = "ActionRegister")]
    public ActionResult SignUp_Register(SignUpViewModel vm)
    {
        return View();
    }

I tried changing it from submit to button and it worked for all of 2 posts and then stopped?!

i'm completely lost for reasons... i bet i'm doing soemthing completely stupid...

Post output from firebug:

Parametersapplication/x-www-form-urlencoded
Email   wayne@isit.gd
Password    sdfsdfsdfsdf
PublicSite  false
SiteUrl sdfsdfsdf
ThemeId 
UserName    Usernames-12131
Source
Content-Type: application/x-www-form-urlencoded Content-Length: 112 UserName=Usernames-Sux0r&Password=sdfsdfsdfsdf&Email=wayne%40isit.gd&ThemeId=&PublicSite=false&SiteUrl=sdfsdfsdf


Have you set the name on the input?

Form fields don't get sent unless you specify the "name" attribute.

<input type="submit" name="Delete" value="Delete" />
<input type="submit" name="Edit" value="Delete" />

EDIT: I see you're using buttons rather than submit. Which might be the problem.

You need to have use inputs like this:

<input  type="submit" value="Register" name="ActionRegister"/>
<input  type="submit" value="Cancel" name="ActionCancel" class="cancel" />


The way I have done this before is I post my form to same action. In my action I check the value of input button.

So In your case you should do following on your View. Keep the name of both input submit same but different value.

<% using (Html.BeginForm("SignUp", "SetUp", FormMethod.Post))
{%>
<%: Html.ValidationSummary()%>
     <input type="submit" value="Register" name="actionName" />
     <input  type="submit" value="Cancel" name="actionName" class="cancel">Cancel</input>
}

And on your controller

public ActionResult SignUp_Register(SignUpViewModel vm,string actionName)
{
    if(actionName =="Register")
          //Do something;
    if(actionName =="Cancel")
          //Do something;

    return View();
}

In standard cases these should work....

Let me highlight something interesting now...!!

1)On Submit event of the form if you are disabling all input type of submit in your JavaScript to disable double submit, then you will always get null values for them in the controller as they are disabled.

2)I realized that you have cancel class on your submit which has some unintended behavior if you are using jQuery validation. Ref: http://docs.jquery.com/Plugins/Validation/Reference

Hope this helps..!!


This:

<button  type="submit" value="Register" name="ActionRegister" >Register</button>
<button  type="submit" value="Cancel" name="ActionCancel" class="cancel" >Cancel</button>

Seems to work?! wtf?


You need to set equal the id of the button (View) and the name of the variable to receive (Controller) The value of the button will be sent to the variable

    <button type="submit" id="btnRegister" name="btn" class="btn btn-primary" value="Register">
        Register
    </button>
    <button type="submit" id="btnCancel" name="btn" class="btn btn-primary" value="Cancel">
        Cancel
    </button>

And your controller:

    [HttpPost]
    public ActionResult SignUp_Register(string btn, SignUpViewModel vm m)

variable btn will be either "Register" or "Save" depending on the button clicked

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜