C#MVC返回视图(对象)会产生查询字符串吗?

时间:2011-04-01 08:30:43

标签: c# asp.net-mvc

我有这个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>

<% } %>

这是为什么?我不希望显示查询字符串。

5 个答案:

答案 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();
}