我有这个actionresult方法:
public ActionResult MenuItemCreated(MenuItem item)
{
return View(item);
}
这是我的观点:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MenuItem>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
MenuItemCreated
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>MenuItemCreated</h2>
<%: Model.Caption %> is created succesfully
</asp:Content>
我在页面上看到的内容是正确的(测试已成功创建)。但我的查询字符看起来像这样:
http://localhost:62602/Admin/MenuItemCreated/2?Caption=test&Link=%2Fclient
编辑: 从这个方法调用ActionResult:
public ActionResult CreateMenuItem(FormCollection fc)
{
MenuItem menuItem = CreateMenuItemFrom(fc);
SaveMenuItem(menuItem);
return RedirectToAction("MenuItemCreated", menuItem);
}
编辑II:
对应观点:
<% using (Html.BeginForm("CreateMenuItem","Admin",FormMethod.Post)) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.Caption) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Caption) %>
<%: Html.ValidationMessageFor(model => model.Caption) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Link) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Link) %>
<%: Html.ValidationMessageFor(model => model.Link) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.ParentId) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.ParentId) %>
<%: Html.ValidationMessageFor(model => model.ParentId) %>
</div>
<p>
<input type="submit" value="Create MenuItem" />
</p>
</fieldset>
<% } %>
这是为什么?我不希望显示查询字符串。
答案 0 :(得分:7)
问题在于以下几行:
return RedirectToAction("MenuItemCreated", menuItem);
执行重定向时,无法传递此类复杂对象。只有简单的标量属性:
return RedirectToAction("MenuItemCreated", new {
id = menuItem.Id
});
然后在您重定向的操作内部,以获取给定id:
的相应菜单项模型public ActionResult MenuItemCreated(int id)
{
var menuItem = _someRepository.GetMenuItem(id);
...
}
答案 1 :(得分:1)
由于RedirectToAction
在浏览器中循环,因此需要传递您在网址上指定的信息。
您可以通过TempData将数据传递给“MenuItemCreated”。使用TempData,您的对象不会通过浏览器。
但MenuItemCreated
需要知道数据是通过TempData预期的,而不是通过arguments / querystring。
public ActionResult CreateMenuItem(FormCollection fc){
MenuItem menuItem = CreateMenuItemFrom(fc);
SaveMenuItem(menuItem);
TempData["menuitem"] = menuitem;
return RedirectToAction("MenuItemCreated");
}
public ActionResult MenuItemCreated(){
MenuItem menuItem = TempData["menuitem"] as MenuItem;
// ....
}
注意:这使得参数从一个动作传递到另一个动作非常模糊。
您还可以从“CreateMenuItem”返回视图“MenuItemCreated”,如下所示:
public ActionResult CreateMenuItem(FormCollection fc){
MenuItem menuItem = CreateMenuItemFrom(fc);
SaveMenuItem(menuItem);
return View("MenuItemCreated", menuitem);
}
URL不会更改为“MenuItemCreated”,但会呈现视图MenuItemCreated的内容。
答案 2 :(得分:0)
试试这个:
public ActionResult CreateMenuItem(FormCollection fc)
{
MenuItem menuItem = CreateMenuItemFrom(fc);
SaveMenuItem(menuItem);
// tell this action method which view to render
return View("MenuItemCreated", menuItem);
}
public ActionResult MenuItemCreated(MenuItem item)
{
return View(item);
}
答案 3 :(得分:0)
您必须在actionresult方法
上设置post属性[HttpPost()]
public ActionResult MenuItemCreated(MenuItem item)
{
return View(item);
}
答案 4 :(得分:0)
试试这个:
public ActionResult MenuItemCreated(MenuItem item)
{
ViewData.Model = item;
return View();
}