web-dev-qa-db-fra.com

Soumettez le formulaire en utilisant AJAX dans Asp.Net mvc 4

J'essaie d'apprendre asp.net et, jusqu'à présent, je peux charger le contenu d'autres pages sans actualiser les données à l'aide de Ajax.Actionlink Et AjaxOptions(), mais je n'arrive pas à comprendre comment utiliser ajax lors de l'envoi d'un message. forme. J'ai fait beaucoup de recherches sur Google, mais je n'ai pas trouvé la solution appropriée. Voici mes codes,

Page de contrôleur

namespace CrudMvc.Controllers
{
public class HomeController : Controller
{
    sampleDBEntities db = new sampleDBEntities(); 
    //
    // GET: /Home/

    public ActionResult Index()
    {
        return View(db.myTables.ToList());
    }

    public PartialViewResult Details(int id = 0)
    {
        myTable Table = db.myTables.Find(id);
        return PartialView(Table);
    }

    [HttpGet]
    public PartialViewResult Create()
    {
        return PartialView();
    }

    [HttpPost]
    public ActionResult Create(myTable table)
    {
        if (ModelState.IsValid)
        {
            db.myTables.Add(table);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(table);
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}
}

Index Voir la page

@model IEnumerable<CrudMvc.Models.myTable>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

<h2>Index</h2>

<p>
@Ajax.ActionLink("Add New", "Create", new AjaxOptions()
   {
    HttpMethod = "GET",
    UpdateTargetId = "info",
    InsertionMode = InsertionMode.Replace   
   })
</p>
<div id="main">
<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.name)
    </th>
    <th>Action</th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.name)
    </td>
    <td>
        @Ajax.ActionLink("Details", "Details", new{ id=item.id}, new AjaxOptions()
   {
    HttpMethod = "GET",
    UpdateTargetId = "info",
    InsertionMode = InsertionMode.Replace   
   })
    </td>
</tr>
}
</table>
</div>
<div id="info"></div>

Create Voir la page

@model CrudMvc.Models.myTable

@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

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

<fieldset>
    <legend>myTable</legend>

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

    <div class="editor-label">
        @Html.LabelFor(model => model.name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.name)
        @Html.ValidationMessageFor(model => model.name)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<script>
var form = $('#main');
$.ajax({
    cache: false,
    async: true,
    type: "POST",
    url: form.attr('action'),
    data: form.serialize(),
    success: function (data) {
        alert(data);
    }
});
</script>

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

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
27
Shihan Khan

Voici l'exemple complet -

Permet de créer un modèle simple -

public class Details
{
    public string Name { get; set; }
    public string Email { get; set; }
}

Créons maintenant quelques actions pour faire les requêtes GET et POST en utilisant AJAX BEGINFORM -

    static List<Details> details = new List<Details>(); 
    public ActionResult GetMe()
    {
        return View();
    }

    public ActionResult SaveData(Details d)
    {
        details.Add(d);
        return Json(details.Count, JsonRequestBehavior.AllowGet);
    }

Créons ensuite une vue simple qui hébergera Ajax.BeginForm () -

@model RamiSamples.Controllers.Details

@{
    ViewBag.Title = "Ajax";
}

<h2>Ajax</h2>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

@using (Ajax.BeginForm("SaveData", new AjaxOptions()
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "dane"
}))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Details</legend>

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

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

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

<div id="dane">
    Number of Details : 
</div>

Maintenant, quand la page sera rendue -

enter image description here

Maintenant, lorsque vous entrez des données et cliquez sur le bouton Créer -

enter image description here

Et puis la page sera automatiquement mise à jour avec le nombre d'ajouts comme indiqué ci-dessous -

enter image description here

74
ramiramilu