Hola, estoy haciendo mi proyecto en asp.net,

comportamiento esperado básico : complete el nombre del formulario, seleccione el módulo maestro (desplegable), seleccione los submódulos (desplegable), ajax pasa la identificación del desplegable del submódulo, crea (envía) ... enviará todos los valores,

ahora el código se comporta ---- complete el nombre del formulario, seleccione el maestro y el submódulo, mientras que al seleccionar el submódulo del segundo menú desplegable se llama la llamada ajax, y se llama a la acción de creación, por lo que se llama al nombre del formulario y masterID (que se extrae del primer menú desplegable) se quedó en blanco ... así que necesito evitar que la llamada ajax llame al controlador

Myform en vista de maquinilla de afeitar

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Form</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.FormName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.FormName)
            @Html.ValidationMessageFor(model => model.FormName)
        </div>

        <select id="State" name="state"></select><br />
        <p>
            <input id="sbmt" type="submit" value="Create" />
        </p>
    </fieldset>
}

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

Mi llamada ajax

 $('#State').change(function () {
            var a = $('#State').val();
            var token = $('[name=__RequestVerificationToken]').val();
            $.ajax({
                url: "/form/create",
                type: "POST",
                data: { __RequestVerificationToken: token, 'SubID': a }
            });

        });

Mi controlador

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Form form,  int SubID)
        {
            if (ModelState.IsValid)
            {
                form.CreatedBy = 1;
                form.SubId = SubID;
               form.CreatedDate = DateTime.Now;
                form.ModifyBy = 1;
                form.ModifyDate = DateTime.Now;
                form.IsActive = true;
                form.IsDeleted = false;
                db.Forms.Add(form);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.MasterID = new SelectList(db.Departments, "MasterId", "ModuleName", form.MasterID);
            return View(form);
        }
0
Jot Dhaliwal 2 sep. 2014 a las 19:37

2 respuestas

La mejor respuesta

De los comentarios, desea poder volver a publicar el valor del estado seleccionado cuando envíe el formulario. El mejor enfoque sería utilizar un modelo de vista que incluya la propiedad SubId y vincular su dropdownlist a esa propiedad (el parámetro SubId en su método POST no es necesario.

@Html.DropDownListFor(m => m.SubId, ....)

La alternativa es cambiar el nombre del control a SubId para que coincida con el parámetro en su método POST

<select name="SubId" ...>

Y elimine la función de JavaScript innecesaria $('#State').change(function () {...

1
user3559349user3559349 3 sep. 2014 a las 12:08

Supongo que la forma más fácil para ti sería usar los ayudantes ajax de MVC. Cambia tu forma así:

@using (Ajax.BeginForm("Create", "Home", null, new AjaxOptions { OnSuccess = "OnSuccess" }))
{
...

Y luego agregue un controlador de JavaScript para el éxito

function OnSuccess(){
   alert("success");
}

Este es un código apenas funcional solo para comenzar.

PD. Asegúrese de agregar una referencia a ~ / Scripts / jquery.unobtrusive-ajax.min.js

0
Andrei Dvoynos 2 sep. 2014 a las 16:39