我想要完成的是一个partiel视图包含一个表单。此表单使用JQuery $ .post发布。在成功发布后,javascript会获取结果并使用JQuery的html()方法来填充带有结果的容器。
但是现在我不想返回部分视图,而是返回包含该局部视图和其他一些对象的JSON对象(在这种情况下,成功 - > bool)。
我尝试使用以下代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Item item)
{
if (ModelState.IsValid)
{
try
{
// ...
return Json(new
{
Success = true,
PartialView = PartialView("Edit", item)
});
}
catch(Exception ex)
{
// ...
}
}
return Json(new
{
Success = false,
PartialView = PartialView("Edit", item)
});
}
但是我没有在这个JSON对象中获取HTML,也无法使用html()来显示结果。我尝试使用this方法将部分渲染为Html并发送。但是,这在RenderControl(tw)方法上失败,但是:方法或操作未实现。
答案 0 :(得分:1)
是的,有一种更清洁的方式(我认为也更容易)。使用MVC AJAX助手。
例如,在您的视图中:
<% using (Ajax.BeginForm("Edit", new { id = Model.Id},
new AjaxOptions
{
UpdateTargetId = "divId", //id of the container
OnFailure= "function(){ alert('Error');}" //can be a callback too
}))
{ %>
然后在你的控制器中:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Item item)
{
if (ModelState.IsValid)
{
try
{
// ...
return PartialView("Edit", item); //your container will be updated with this content
}
catch(Exception ex)
{
// ...
return ReturnStatusCodeError("Item not found", HttpStatusCode.NotFound); //the ajax script will catch this error and fire the OnFailure event
}
}
return ReturnStatusCodeError("Error", HttpStatusCode.Conflict); //can be changed to an error of your preference
}
protected ActionResult ReturnStatusCodeError(string error, HttpStatusCode code)
{
Response.StatusCode = (int)code;
Response.Write(error);
Response.End();
//redundant. Just for compiler compliance
return View();
}
这样,您的容器可以在提交和成功时自动更新。如果出现错误,您可以执行更复杂的配置“OnFailure”ajax选项。
答案 1 :(得分:0)
好的,找出为什么这个页面上的代码:
Render a view as a string
没用。
愚蠢:我必须包含System.Web.Mvc.Html才能在HtmlHelper对象上使用renderpartial。
然而,我并不是真的相信这个解决方案。必须有一个更清洁的方式吗?