Ajax使用空模型调用控制器操作

时间:2013-12-06 14:45:40

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

单击“更新名称”按钮时,将调用UpdateDetails操作,但所有属性的Customer模型参数均为空。这是为什么?

控制器:

public class CustomerController : Controller
{
    public ActionResult Index(int id)
    {
        Customer customer = GetCustomer(id);

        return View(customer);
    }

    [HttpPost]
    public PartialViewResult UpdateDetails(Customer customer)
    {
        UpdateCustomer(customer);

        return PartialView("CustomerUpdateResult", true);
    }
}

查看摘录

@model MvcTest.Models.Customer

@using (Ajax.BeginForm("UpdateDetails", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "CustomerUpdateResultDiv" }))
{
    @Html.TextBoxFor(cust => cust.Name)
    <input type="submit" value="Update Name" />
}

<div id="CustomerUpdateResultDiv"></div>

1 个答案:

答案 0 :(得分:1)

上面的代码(有问题)应该可以正常运行,假设您没有任何其他代码劫持您的点击事件并执行其他操作。

但是你只会得到name属性值,因为你只有表单中的那个。所以其他所有属性都将为null。您可以做的是在表单中包含更多属性或再次读取客户对象,并在保存之前仅设置更新的属性值。

@using (Ajax.BeginForm("UpdateDetails", new AjaxOptions { HttpMethod = "POST", 
                                   UpdateTargetId = "CustomerUpdateResultDiv" }))
{
    @Html.TextBoxFor(cust => cust.Name)
    @Html.HiddenFor(c=>c.CustomerID)
    <input type="submit" value="Update Name" />
}

在HttpPost操作中,使用CustomerID获取客户对象并更新相关的属性值。

[HttpPost]
public PartialViewResult UpdateDetails(Customer customer)
{
    var existingCustomer = GetCustomer(id);
    if(existingCustomer!=null)
    {
      existingCustomer.Name=customer.Name;
      UpdateCustomer(existingCustomer);
      return PartialView("CustomerUpdateResult", true);
    }
    return PartialView("CustomerNotFound", true);
}