在控制器的POST操作中没有显示ViewBag值?

时间:2015-07-10 19:02:11

标签: asp.net-mvc razor asp.net-mvc-5 viewbag

我的MVC5应用程序(Oracle后端)中存在这样的情况,其中我必须在转移到View的GET时存储当前URL(此URL包含用户以前的导航位置以及任何/所有排序/过滤标准在数据网格上提出。)

起初我以为我已经通过使用Session变量Session["returnURL"]来解决这个问题,但是当它在我的localhost上运行时,许多尝试仍会导致我的会话变量在执行期间抛出NullReferenceException我的生产服务器。我现在在GET Edit操作上有以下内容:

        if (Request.UrlReferrer.AbsoluteUri != null)
        {
            ViewBag.ReturnURL = Request.UrlReferrer.AbsoluteUri;
        }
        else
        {
            ViewBag.ReturnURL = null;
        }

如果上述值不为null,我将其存储在ViewBag中以访问我的View(在actionlink上将其指定为href):

         @{
                if (ViewBag.ReturnURL == null)
                {
                    <span class="btn btn-default">
                        @Html.ActionLink("Back to List", "Index", "Home", new { @class = "btn btn-default" })
                    </span>
                }
                else
                {
                    <a href="@ViewBag.ReturnURL"><span class="btn btn-default">Back to List</span></a>
                }
            }
                     |
                    <input type="submit" value="Save"  class="btn btn-primary" />

我现在的问题是,当我尝试将更改保存到我的记录中(从而进入我的编辑操作的POST)时,我收到:

Server Error in '/' Application. Value cannot be null or empty. Parameter name: url. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.ArgumentException: Value cannot be null or empty. Parameter name: url

以下是我的POST编辑操作的相关代码:

        if (ModelState.IsValid)
        {
            iNV_Assets.MODIFIED_DATE = DateTime.Now;
            iNV_Assets.MODIFIED_BY = System.Environment.UserName;

            db.Entry(my_Model).State = EntityState.Modified;
            await db.SaveChangesAsync();

            var returnURL = ViewBag.ReturnURL;
            return Redirect(returnURL);
        }

使用我所做的任何更改保存记录,但是当尝试使用用户的先前URL(以及所有指定的搜索条件)重定向回主视图时,会抛出错误。

有没有人知道为什么我的ViewBag.ReturnURL在POST编辑操作结果中以NULL的形式出现?关于如何用替代解决方案实现我的目标的任何想法或许?

4 个答案:

答案 0 :(得分:6)

您想要回发的任何值都需要位于表单标记内的输入字段中,因此请将其放在表单中的某个位置

<input type="hidden" value="@ViewBag.ReturnURL" name="returnURL" />

然后您需要向名为string returnUrl的操作添加参数或使用Request.Form。其他选项包括向模型添加属性并设置它并为该属性添加隐藏字段

我经常使用它。将您的观点更改为

@if (ViewBag.ReturnURL == null)
{
    <span class="btn btn-default">
        @Html.ActionLink("Back to List", "Index", "Home", new { @class = "btn btn-default" })
    </span>
}
else
{
    <a href="@ViewBag.ReturnURL"><span class="btn btn-default">Back to List</span></a>
    <input type="hidden" value="@ViewBag.ReturnURL" id="returnURL" />
}

然后将您的修改操作更改为

[HttpPost]
public ActionResult Edit(ModelName my_Model, string returnURL)
{
    if (ModelState.IsValid)
    {
        iNV_Assets.MODIFIED_DATE = DateTime.Now;
        iNV_Assets.MODIFIED_BY = System.Environment.UserName;

        db.Entry(my_Model).State = EntityState.Modified;
        await db.SaveChangesAsync();

        if (!string.IsNullOrEmpty(returnURL))
            return Redirect(returnURL);
    }
    return View(my_Model);
}

答案 1 :(得分:2)

这是正常行为,重定向时viewbag设置为null。

解决方案是使用TempData

答案 2 :(得分:0)

毕竟,我最终能够使用Session["variables"]作为我的解决方案。我在这篇文章中找到了答案(The Session object is null in ASP.NET MVC 4 webapplication once deployed to IIS 7 (W 2008 R2)),其中我修改了<modules>部分以执行以下指定值的add/remove

  <configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

我仍然不完全确定为什么这是答案,但在这种情况下它适用于我的问题。

答案 3 :(得分:0)

您还可以在Razor中使用隐藏字段

        @{
            if (ViewBag.ReturnURL == null)
            {
                <span class="btn btn-default">
                    @Html.ActionLink("Back to List", "Index", "Home", new { @class = "btn btn-default" })
                </span>
            }
            else
            {
                <a href="@ViewBag.ReturnURL"><span class="btn btn-default">Back to List</span></a>
            }
        }
                 @Html.Hidden("returnURL", (string)ViewBag.ReturnURL)
                <input type="submit" value="Save"  class="btn btn-primary" />

并在控制器中

[HttpPost]
public ActionResult Edit(ModelName my_Model, string returnURL)
{
if (ModelState.IsValid)
{
    iNV_Assets.MODIFIED_DATE = DateTime.Now;
    iNV_Assets.MODIFIED_BY = System.Environment.UserName;

    db.Entry(my_Model).State = EntityState.Modified;
    await db.SaveChangesAsync();

    if (!string.IsNullOrEmpty(returnURL))
        return Redirect(returnURL);
}
return View(my_Model);
}