2015-06-12 2 views
3

Я знаю, что эта тема была интересна многим разработчикам и обсуждалась на многих форумах, но я не смог найти правильный ответ, который вполне решает мою проблему. Возможно, я не очень старался найти ответ, и в этом случае было бы неплохо, если бы ваши коллеги-разработчики могли сообщить мне о любых полезных форумах.MVC традиционная форма действия не вызывающая метод контроллера

Проблема, с которой я столкнулась, - это просто традиционное действие HTML, не вызывающее метод ActionResult контроллера.

У меня есть частичный вид под названием "_Form.cshtml" следующим образом:

< _Form.cshtml>

<form action="@Url.Action("Temp_Form", "Product")" method="post" class="k-content" id="tempForm"> 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 
    <fieldset> 
    <p class="lead">Please fill in the following form.</p> 
    <br /> 

    <div class="form-horizontal"> 
     <div class="form-group"> 
      @Html.Label("Brand", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @(Html.Kendo().DropDownList() 
       .Name("ddlBrand") 
       .OptionLabel("--- Select ---") 
       .HtmlAttributes(new { id = "brand", required = "required", data_required_msg = "Select Brand", @class = "form-control" }) 
       .DataTextField("Name") 
       .DataValueField("Id") 
       .BindTo(Products.ProductBrandCollection.LoadAll()) 
       ) 
       <span class="k-invalid-msg" data-for="ddlBrand"></span> 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.Label("Range", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @(Html.Kendo().TextBox() 
       .Name("tbRange") 
       .HtmlAttributes(new { required = "required", validationmessage = "Enter Range" }) 
       ) 
       <span class="k-invalid-msg" data-for="tbRange"></span> 
      </div> 
     </div> 
    </div> 

    <div id="buttondiv"> 
     <div class="column"> 
      <div class="vis" id="submitbutton"> 
       @(Html.Kendo().Button() 
       .Name("btnSubmit") 
       .HtmlAttributes(new { type = "submit", @class = "button-next" }) 
       .Icon("arrowhead-e") 
       .Content("SUBMIT") 
       .Events(e => e.Click("submit")) 
       ) 
      </div> 
     </div> 
    </div> 
    </fieldset> 
</form> 

В главном окне "Product.cshtml", я следующий яваскрипт нажмите событие для кнопки отправки:

function submit(e) { 
    // handles hiding and showing divs 
} 

Вот мой ActionResult "Temp_Form", который находится в "ProductController.cs":

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Temp_Form(string ddlBrand, string tbRange) 
{ 
    TempData["brand"] = ddlBrand; 
    TempData["range"] = tbRange; 
    return Content(""); 
} 

Я sussing это либо «@ Url.Action (» ActionMethod «„контроллер“)» < - эта часть не будучи правильно отформатирован или имеющие как „тип =“ отправить «и» .Events (е => e.Click ("submit")) "для кнопки отправки.

** По какой-то причине я не использую Html.BeginForm() для вызова метода контроллера. Поэтому мой вариант - использовать традиционную форму для передачи данных с представления на контроллер с кнопкой отправки.

Я также пробовал ..

<form action="myController/myAction" method="POST"> 

выше формат, но мой ActionResult до сих пор не называется.

Я не думаю, что мой основной вид вызывает срабатывание ActionResult, поскольку он имеет только два каскадных DropDownLists, которые выбирают правильную форму на стороне клиента.

Может ли кто-нибудь определить, что я делаю неправильно, или посоветовать мне альтернативы? Как я уже упоминал выше, я не случайно использую Html.BeginForm() просто потому, что у меня есть те Telerik Kendo Validations, которые, похоже, работают только с традиционной формой.

Большое спасибо!

+6

Почему вы не используете 'Html.BeginForm()'? Почему у вас есть '@ Html.AntiForgeryToken()' вне тегов формы? Что такое код в вашей функции submit (e) {'? –

+0

«Я не случайно использую Html.BeginForm() просто потому, что у меня есть те Telerik Kendo Validations, которые, похоже, работают только с традиционной формой.« По некоторым причинам, если я перехожу к Html.BeginForm(), проверка сообщения не отображаются. Я исключил submit (e) просто потому, что не думал, что он имеет отношение к этой теме, поскольку он обрабатывает только скрытие и отображение div. – AUSupernova

+0

Не знаком с проверками Kendo, но, возможно, потому, что '@ Html.BeginForm()' будет добавлять 'novalidate =" novalidate "' (но вы могли бы просто использовать '@ Html.BeginForm()' и установить атрибут «novalidate» в пустую строку, но это не имеет ничего общего с вашей проблемой, поскольку «action =» @ Url.Action («Temp_Form», «Product») »будет генерировать правильный URL-адрес. Вы можете легко проверить это, @ (Html.Kendo(). Button() ... "и заменить на' ', который затем должен отправляться в ваш метод. –

ответ

2

Этот вопрос вы регулируете отправку формы с событием JavaScript ...

Так что если вы хотите сохранить событие JS для кнопки отправки мыши вы должны использовать Ajax вызов из метода JS чтобы сделать POST к действию, что-то вроде:

$.ajax({ 
    url: '/Product/Temp_Form', 
    data: $('#tempForm').serialize(), 
    type: 'POST', 
}); 
+0

Итак, я закончил тем, что использовал ваш путь @Aram, и все работает так, как я хотел для выполнения. Спасибо за ваш совет! – AUSupernova

+0

@ausupernova отлично, рад, что это помогло ... – Aram

0

Вы используете синтаксис Razor поэтому не используйте тэг формы непосредственно, используйте Html.BeginForm(), как показано ниже.

@using(Html.BeginForm("Temp_Form", "Product", FormMethod.Post, new {@class = "k-content", @id="tempForm" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 
    <fieldset> 
     //your HTML here 
    </fieldset> 
} 

Кроме того, если это возможно использование строго типизированные модели вместо свободных строковых свойств, как ddlBrand и tbRange.

Смежные вопросы