【问题标题】:Submit form using AJAX in Asp.Net mvc 4在 Asp.Net mvc 4 中使用 AJAX 提交表单
【发布时间】:2014-10-04 10:11:11
【问题描述】:

我正在尝试学习 asp.net,到目前为止,我可以加载其他页面内容而无需使用 Ajax.ActionlinkAjaxOptions() 刷新,但我不知道如何在提交表单时使用 ajax。我做了很多谷歌搜索,但找不到合适的解决方案。这是我的代码,

控制器页面

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查看页面

@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查看页面

@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")
}

【问题讨论】:

标签: javascript jquery asp.net ajax asp.net-mvc


【解决方案1】:

这里是完整的例子 -

让我们创建一个简单的模型 -

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

现在让我们创建几个操作来使用AJAX BEGINFORM 发出 GET 和 POST 请求 -

    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);
    }

然后让我们创建一个简单的视图来承载 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>

现在当页面被渲染时 -

现在,当您输入数据并单击创建按钮时 -

然后页面会自动更新添加的数量如下图-

【讨论】:

  • @ramiramilu 感谢这个很好的例子。我已经设法应用这种方法,但遇到了两个问题:1)我曾经将TempData["message"]从Controller返回到View。实际上它似乎被填充并返回到视图中,但看不到。是否可以通过这种方法使用TempData["message"]? 2)我无法通过这种方法将上传的文件IEnumerable&lt;HttpPostedFileBase&gt; files 传递给控制器​​。如何解决这个问题?
  • @Christof 您可以使用 AJAX 上传文件,我曾经想到使用 TempData 的方法是返回 PartialView 并更新目标 div。
  • @ramiramilu 你能举个例子吗?请在你的答案中添加更新?
  • @Christof 为了保护答案的完整性,我建议发布一个包含具体细节的新问题。
  • 嗨,我成功了 - 这是因为我需要各种参考资料 - 不知道为什么......这就是我最终得到的结果...... bundles.Add(new ScriptBundle(" ~/bundles/jquery").Include("~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.validate*", "~/Scripts/jquery.unobtrusive*"));
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多