视图中的按钮可在单击时返回上一个视图
Posted
技术标签:
【中文标题】视图中的按钮可在单击时返回上一个视图【英文标题】:A button in a view brings back the previous view on click 【发布时间】:2013-05-16 14:50:51 【问题描述】:我正在构建一个 MVC 应用程序,我想提交一个表单。所以我做了这样简单的事情。这是“DisplayItems”视图:
@model List<MyApp.Models.Inventory>
@
ViewBag.Title = "Display Items";
@using (html.BeginForm())
<table>
<tr>
<th>Object Name</th>
<th>Number In Stock</th>
<th>Quantity To Send</th>
<th>Reserved for First Template</th>
<th>Reserved for Second Template</th>
<th>Reserved for Third Template</th>
<th>Number so far</th>
<th>Input quantity</th>
</tr>
@for (int i = 0; i < Model.Count(); i++)
<tr>
<td>@Html.DisplayFor(_x => _x[i].m_Obj.m_ObjName)</td>
<td>@Html.DisplayFor(_x => _x[i].m_QtyToSendShow)</td>
<td>@Html.DisplayFor(_x => _x[i].m_NbInStock)</td>
<td>@Html.DisplayFor(_x => _x[i].m_QtyFirstTemplate)</td>
<td>@Html.DisplayFor(_x => _x[i].m_QtySecondTemplate)</td>
<td>@Html.DisplayFor(_x => _x[i].m_QtyThirdTemplate)</td>
<td>@Html.DisplayFor(_x => _x[i].m_QtyHold)</td>
<td>@Html.TextBoxFor(_x=>_x[i].m_QtyToSend)</td>
</tr>
</table>
<input type="submit" name="_submitButton" value="Confirm"/>
没什么特别的。但是,当用户单击“确认”按钮时,应用程序会不断返回到 PREVIOUS 视图,该视图是用户指定搜索的过滤引擎。
这是之前名为“SendItems”的视图:
@
ViewBag.Title = "Send items";
<h2>Send Items</h2>
<p>
@using (Html.BeginForm())
Html.RenderAction("AdvancedSearch", "PartialViews");
@Html.ActionLink("Back to Selection", "MenuSelection")
</p>
部分视图是绑定到具有许多字段和输入按钮的模型的视图。当点击按钮输入时,控制器方法被点击如下:
public ActionResult SendItems(SearchEngineObject _searchObj, string _submitButton)
if (_submitButton == "Search")
bool isValid = ValidateSearchFields(_searchObj);
if (!isValid)
ViewData["ErrorMessage"] = m_MessageError;
return View();
m_ListToManage = m_InventoryManager.ListAvailableInventoryItems(_searchObj);
if (m_ListInventoryToManage.Count == 0)
ViewData["ErrorMessage"] =
"There are no inventory items belonging to the parameters you selected; " +
"please change your values and try again.";
return View();
return View("DisplayItems", m_ListInventoryToManage);
return View();
因此,当点击 SendItems 视图中的输入按钮时,控制器会验证字段,然后根据过滤器检索库存项目列表并将其发送到“DisplayItems”视图。
但是刚进入视图,如果我单击“确认”按钮,它会直接将我发送回“SendItems”视图,而我希望它转到“DisplayItems”控制器方法。为什么?谁能解释我做错了什么?
编辑
我进行了一次快速调试会话,我可以确认调试将我发送回“发送项目”控制器方法,而不是点击“显示项目”方法。
【问题讨论】:
您对不同的动作使用相同的动作方法。这不是一个正确的 MVC 结构。我建议您相应地拆分这些操作。 你的意思是两个视图都调用了同一个ActionResult方法? 他的意思是当用户第一次请求页面时它转到SendItems
,但是当从表单回发时,它又转到SendItems
,所以你会一遍又一遍地得到同样的东西。您需要回发以使用不同的方法。
是的。每个动作方法应该只有一个赋值。因此,您将有一个操作(它是 view)来获取列表,以及另一种方法来显示所选项目的详细信息。
啊,好的。所以基本上我需要为每种方法制作一个 HttpPost / HttpGet 就可以了吗?
【参考方案1】:
我可能对此不满意,但您可以做的一件事是用[HttpGet]
和[HttpPost]
标记您的Action 方法,以便执行将遵循不同的路径,具体取决于它是否是原始页面get
或形成post
-back,如:
public class HomeController : Controller
// The original page render will go here
[HttpGet]
public ActionResult Index()
return View(new MyModel());
// The form postback will go here
[HttpPost]
public String Index(MyModel model)
return "Something";
这是一个使用常规 HTML 的简单模型:
<div>
<form method="post">
<input type="text" name ="FirstName" value ="@Model.FirstName" />
<input type="submit" value="submit" />
</form>
</div>
但是你也可以用你的Html.BeginForm
做同样的事情(将方法设置为'post'而不是默认的'get'),只需指出它应该是post
而不是@987654329 @,它应该路由到相同的操作方法,但使用 post 标签而不是 get 标签。
【讨论】:
【参考方案2】:让我们谈谈如何组织事情以避免每个操作方法的分配超过 1 个。
我不确定我的模型是否正确,但让我们假设您有一个项目列表,并且您希望用户选择一个项目来显示详细信息,好吗?
更新:有一个POST List
用于过滤列表。
您的服务器端会这样:
public class ItemController : Controller
public ActionResult List()
//fetch from db
return View(yourViewModel);
[HttpPost]
public ActionResult List(string firstLilPig, int secondLilPig, string thirdLilPig)
//fetch from db using the little pigs as filters
return View(yourViewModel);
public ActionResult Details(int id)
//fetch one item using the id
return View(theItemViewModel);
这样做,您将有 2 个视图:/Item/List.cshtml 和 /Item/Details.cshtml。 POST List
不会有第三个视图。它使用相同的/Item/List.cshtml,改变的是view model(你为它传递的数据)。
最后,浏览/超链接的 URL 如下:
http://.../item/list
http://.../item/details/1
更新
根据您的用例,我推荐以下结构:
搜索
方法:GET
参数:无
查看:搜索列表
方法:POST
参数:过滤条件
查看:如果结果为空,则列出或搜索请求
方法:POST
参数:项目 id 和数量列表(来自结果表)
观点:无。将内容保存到数据库并重定向到结果结果
方法:GET
参数:无
查看:结果。显示上一个请求的结果
注意事项:
-
顺序为:搜索 > 列表 > 请求 > 结果。列表可能会重定向回搜索
请求>结果遵循PRG原则。这样,如果用户在结果页面上按 F5,则不会重新提交请求。
您应该在 Request 的视图模型上工作。它会有一个 ItemRequest 数组,其中包含 ItemID 和 Quantity 作为属性。
【讨论】:
我觉得我的结构有点乱。 @HerveS 如果您还有其他问题,请告诉我。 我需要一个视图来过滤选择,然后是一个视图来显示获得的列表。我怎么能这样做?然后对该显示的列表应用一个操作? @HerveS 是的,考虑以下用例:(1) 用户浏览到 items 页面 (2) 所有项目(或最受欢迎的项目,或前 10 个项目,或显示“优化您的搜索”消息 (3) 用户提交过滤后的搜索 (3) 用户接收搜索结果 (4) 用户单击项目以查看详细信息 (5) 用户获取该项目的完整详细信息页面 @HerveS 你去。到目前为止,至少对于咨询服务来说,赞成票会很有趣=)以上是关于视图中的按钮可在单击时返回上一个视图的主要内容,如果未能解决你的问题,请参考以下文章