ASP.NET:从控制器传递消息到视图(ViewBag,ViewData或TempData)

时间:2018-06-13 13:07:04

标签: c# asp.net asp.net-mvc

情况

在我的ASP.NET项目中,我有一个允许用户更改密码的视图。提交表单后,将使用RedirectToAction将用户重定向到UserDetail。在这里,我想通知用户密码更改是否成功(计划使用Alertify JS)。然而,我似乎无法成功地将信息从我的控制器传递到我的视野。

在使用RedirectToAction而不使用ViewBagViewDataTempdata时,如何正确地将数据(简单字符串)从控制器传递到视图。?或者,如果有办法解决我目前的困难,很高兴听到。

  1. ViewBag / ViewData :无法使用,因为我返回RedirectToAction我无法通过的地方URL而不是View。我已经考虑过使用Ajax返回JSON而不是使用RedirectToAction这可以让我使用ViewBag,但这会带来一些困难并会改变整体结构该项目。

  2. TempData :我的session中没有配置Startup.cs,因此我不能这样做#39;我错过了Microsoft.AspNetCore.Session命名空间。我也无法添加命名空间,因为这会增加一些复杂性。请参阅以下错误:System.TypeLoadException: 'Method 'ConfigureAppConfiguration' in type 'Microsoft.AspNetCore.Hosting.WebHostBuilder' from assembly 'Microsoft.AspNetCore.Hosting, Version=1.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.'

  3. 我宁愿不使用cookies或某种兑现系统 编辑:我也不想使用查询字符串,但看到评论/答案让我意识到我的选项有限。我忘了早些时候将查询字符串/路由参数添加到列表中。

    ManageController.cs

    [HttpGet]
    public IActionResult UserDetail(int id)
    {
        // Code to GET the UserViewModel
        return View(model);
    }
    
    [HttpGet]
    public IActionResult UserPassword(int id)
    {
        // Code to GET the UserViewModel
        return View(model);
    }
    
    [HttpPost]
    public IActionResult UserPassword(UserViewModel model)
    {
        // Code to check and save the password.
        if (user.Password == model.Password) {
            //ViewData["Message"] = "Succeeded";
            //TempData["Message"] = "Succeeded";
        } else {
            //ViewData["Message"] = "Failed";
            //TempData["Message"] = "Failed";
        }
        // TODO: Alert the user
        return RedirectToAction("UserDetail", new { id = model.UserId });
    }
    

    UserDetail.cshtml

    <!-- Some view code -->
    <form>
        <button class="ui button button-back" type="button" onclick="window.location.href = '@Url.Action("UserPassword", "Manage", new { id = Model.UserId })';">Change Password</button>
    </form>
    <!-- Trying to use ViewData -->
    @*<div id="id-message" data-value="@ViewData["Message"]"></div>*@
    
    <script>
      $(document).ready(function () {
        console.log("Ready");
    
        // Alert the user of a password change
        //var message = $("#id-message").attr("data-value");
        //var message = "@(TempData["Message"] as string)";
        if (message !== null && message !== "") {
          alertify
            .alertmessage, function () {
              alertify.message('OK');
            };
        }
      });
      // Some script code
    </script>
    

3 个答案:

答案 0 :(得分:1)

您可以使用RedirectToAction()方法

将其作为路由参数传递
return RedirectToAction("UserDetail", new { id = model.UserId, message= "" });

并接受它

[HttpGet]
public IActionResult UserDetail(int id, string message)
{
   // Code to GET the UserViewModel
   return View(model);
}

答案 1 :(得分:0)

关于您所描述的其他选项,我建议使用SessionState:

string passwordChange = "Password has been changed";
Session["yourName"] = passwordChange  // inside your if else logic calling it from your UserDetail controller method. 

或者创建一个JsonResult结果来引用一个Ajax调用。

答案 2 :(得分:0)

更改:

[HttpGet]
public IActionResult UserDetail(int id)

[HttpPost]
public IActionResult UserDetail(UserViewModel model)

将Message属性添加到模型中。

应该为您做到