虽然凯文是对的,但我以非 Ajax 的方式做到了这一点。请记住,我正在使用 JSON 数据,所以它以 JSON 为中心。
在您的控制器页面中,删除与 DbContext、Entity Framework 等有关的任何内容。原因是默认情况下,控制器将希望通过调用 DbContext 来执行 CRUD 操作,而我们不希望这样。我们想调用 WebAPI 来执行此操作。
首先,在控制器中声明一些成员变量。您的控制器的其余部分将使用这些:
HttpClient client = new HttpClient();
HttpResponseMessage response = new HttpResponseMessage();
Uri contactUri = null;
在您的控制器中,为您的控制器创建一个构造函数,如下所示:
public ContactController()
{
// set base address of WebAPI depending on your current environment
client.BaseAddress = new Uri("http://server/YourAPI/");
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
}
将 Index 操作的代码替换为以下内容。请注意,唯一相关的部分是client.GetAsync()
调用和var contacts
分配。对于这个问题的上下文,其他一切都不是必需的。里面的值client.GetAsync()
应该是你的控制器的名称,前面是你在 WebApiConfig.cs 中设置的任何自定义路由 - 在我的例子中,我api
在路由中添加了部分来区分 API 调用和正常调用:
public ActionResult Index()
{
response = client.GetAsync("api/contact").Result;
if (response.IsSuccessStatusCode)
{
var contacts = response.Content.ReadAsAsync<IEnumerable<Contact>>().Result;
return View(contacts);
}
else
{
// add something here to tell the user hey, something went wrong
return RedirectToAction("Index");
}
}
将 Create 操作(HttpPost 操作)替换为以下内容。同样,唯一重要的部分是该client.PostAsJsonAsync()
部分 - 这就是调用 WebAPI 的 POST 操作的部分,在我的情况下,它负责将新记录插入数据库:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Contact contact)
{
// Create a new product
response = client.PostAsJsonAsync("api/contact", contact).Result;
if (response.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
else
{
// add something here to tell the user hey, something went wrong
return RedirectToAction("Index");
}
}
将 Edit 操作(非 HttpPost 操作)替换为以下内容。这有点棘手,因为为了进行编辑,您必须先检索记录,所以基本上,HttpPost 版本的 Edit 将包含一些类似的代码,还有一行代码执行编辑 POST (PUT)。下面,我们通过向 WebAPI 传递一个特定的记录 ID 来获取响应。所以,就像索引 (GET) 一样,我们做同样的事情只是传递 ID,所以我们只取回一条记录。然后,我们将响应转换为可以在 View 中操作的实际对象:
public ActionResult Edit(int id = 0)
{
response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
Contact contact = response.Content.ReadAsAsync<Contact>().Result;
if (contact == null)
{
return HttpNotFound();
}
return View(contact);
}
将 Edit 操作(HttpPost 操作)替换为以下内容。下面,我们通过调用client.GetAsync()
主键并将其作为参数 (contact_id) 传递来获取要编辑的记录。然后,我们从该响应中获取 RequestUri 并将其保存。然后,我们调用client.PutAsJsonAsync()
并传入 Uri.PathAndQuery(我们刚刚保存的内容)以及要编辑的对象。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Contact contact)
{
response = client.GetAsync(string.Format("api/contact/{0}", contact.contact_id)).Result;
contactUri = response.RequestMessage.RequestUri;
response = client.PutAsJsonAsync(contactUri.PathAndQuery, contact).Result;
if (response.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
else
{
// add something here to tell the user hey, something went wrong
return RedirectToAction("Index");
}
}
将 Delete 操作(非 HttpPost 操作)替换为以下内容。同样,我们通过简单地调用client.GetAsync()
并将其转换为我的应用程序知道的实际对象来从数据库中获取记录。
public ActionResult Delete(int id = 0)
{
response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
Contact contact = response.Content.ReadAsAsync<Contact>().Result;
if (contact == null)
{
return HttpNotFound();
}
return View(contact);
}
最后,将 Delete 操作(HttpPost 操作)替换为以下内容。同样,我们正在执行类似于 Edit 操作的操作。我们正在获取要删除的记录,将其转换为一个对象,然后将该对象传递给一个client.DeleteAsync()
调用,如下所示。
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
contactUri = response.RequestMessage.RequestUri;
response = client.DeleteAsync(contactUri).Result;
return RedirectToAction("Index");
}