1

我有这个问题:

我转到一个页面,例如:

/Auction/Details/37

这调用了这个动作方法:

public ActionResult Details(int id)

此方法中的特定行是:

return View("DetailsLub", auction);

此视图包含以下行:

@Html.Action("BidOnAuction", new { auctionId = Model.Id })

调用此操作方法:

public PartialViewResult BidOnAuction(int auctionId)

到现在为止还挺好?

现在,我在 BidOnAuction 视图中有一个表单,其中有一个按钮。当我单击此按钮时,将调用此操作方法:

[HttpPost]
public ActionResult BidOnAuction(BidOnAuctionViewModel model)

此操作方法有一个带有以下几行的 catch 语句:

ModelState.AddModelError(string.Empty, operation + @" Failure: " + message);
return RedirectToAction("Details", new { id = model.AuctionId });

现在,DetailsLUB 视图和 BidOnAction 视图都包含这一行:

@Html.ValidationSummary(true)

但是,问题是没有任何东西被打印到屏幕上。我究竟做错了什么?

4

3 回答 3

2

为了在页面上获取验证消息,您需要返回带有模型的视图,因为模型中包含模型状态,如下所示:

return View(Model);

这将返回BidOnAuction带有验证摘要的模型。

于 2012-01-24T12:47:05.077 回答
1

这行代码

return RedirectToAction("Details", new { id = model.AuctionId });

返回RedirectResult类的实例。这通常用于重定向并且不呈现视图。如果要使用 将子操作呈现到父视图中@Html.Action,则需要从该子操作返回视图,而不是 RedirectResult。即使没有子操作,该 RedirectResult 也将不起作用。返回 RedirectResult 会导致浏览器向该操作发出全新的、所有新的请求。无论如何,模型状态都会丢失。你应该做类似的事情

try
{
    //some actions
    return RedirectResult("Details", new { id = model.AuctionId });
}
catch
{
    ModelState.AddModelError(string.Empty, operation + @" Failure: " + message);
    return View("Details", new { id = model.AuctionId });
}
于 2012-01-24T12:47:29.040 回答
1

您不能重定向到新操作并期望模型状态在那里。

如果 modelState 无效,则返回(使用 View(model)),否则重定向到详细信息。

如果您需要详细信息视图中的错误信息,您可以将其添加到 TempData 或将其作为可选参数传入。

于 2012-01-24T12:58:31.283 回答